一、HDFS中的block、packet、chunk
1.Block
在将文件上传到hdfs之间需要分块,这个块就是block,默认为128MB(hadoop2.X),当然可以更改。通过修改core-default.xml文件修改这个值,它是最大的一个单位。
2.Packet
Packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传输数据的基本单位,默认是64kb。
3.Chunk
Chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认为512B,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk的大小为516B。由此可见真实数据与校验值的比值约为128:1
二、HDFS中的写流程
- 客户端通过RPC(远程服务)访问NameNode,请求写入一个文件。
- NameNode检查客户端是否有权限写入,如果有权限返回一个响应。如果没有客户端就会抛出一个异常。
- 客户端会将文件按BlckSize大小(默认128M)将文件切分成若干个Block块,然后请求写入第一个Block块。
- NameNode会根据它的负载均衡机制,给客户端返回满足其副本数量(默认是3)的列表(BlockId:主机,端口号,存放的目录)。
- 客户端根据返回的列表,开始建立管道(pipline)。(管道连接方向:客户端->第一个节点->第二个节点->第三个节点)
- 开始传输数据,Block按照Packet传输,当一个Packet成功传输到第一个DataNode上以后,第一个DodaNode就把这个Packet进行复制,并将这个Packet通过管道传输到下一个DataNode上,下一个DataNode接收到Packet后,继续进行复制,再传输到下一个DataNode上。
- 当一个Block块成功传输完以后,从最后一个DataNode开始,依次从管道返回ACK队列,到客户端。
- 客户端会在自己内部维护着一个ACK队列,跟返回来的ACK队列进行匹配,只要有一台DataNode写成功,就认为这次写操作是完成的。
- 开始进行下一个Block块的写入。重复步骤3-8。
注意:
如果在传输的时候,DataNode宕机了,这个DataNode就会从这个管道中退出。剩下的DataNode继续传输。然后,等传输完成以后,NameNode会再分发出一个节点,去写成功的DataNode上复制出一份Block块,写到新的DataNode上。
三、HDFS中的读流程
- 客户端通过RPC向NameNode发送读请求。
- NameNode确认客户端是否有读权限,如果有,给客户端返回一个响应,如果没有,客户端抛出一个异常。
- 客户端向NameNode请求需要读取的文件。
- NameNode返回存储此文件的每个Block块所在的位置的列表。
- 客户端会从返回的列表中挑选一台最近的,建立连接,读取Block块。读取的时候会将Block块统计目录下的校验信息,一起读取过来。
- 客户端读取完Block块信息以后,会计算出一个校验和跟读取过来的校验和进行对比,如果能匹配上,就说明正确。如果匹配不上,就从其他节点上读取Block块。