一、block、packet、chunk
- (存储)block,最大的一个单元,hdfs上的块数据,文件上传前需要分块,因为块太小寻址时间占比过高,块太大map任务太少,作业执行时间速度变慢
- (传输)packet,第二大单元,它是client端向DN(DataNode),或者DN的PipeLine之间传数据的基本单元,默认64 kb
- (校验)chunk,最小单元,它是client端向DN,或者DN的PipeLine之间进行数据校验的基本单位,默认512 byte,因为作为校验,故每个chunk需要带有4 byte的校验位
二、HDFS的写流程
1、整体写流程
- client向NN(NameNode)发送写文件请求,NN会检查目标文件是否存在,以及目录是否存在
- NN检验完返回可以上传
- client会将文件(例:130M)切分成为两块block(128M ,2M),请求上传第一块block
- NN返回DN服务器列表(可以存储的DN列表)
- client请求一台DN上传数据(RPC调用,建立pipeline),第一个DN收到请求会继续调用第二个DN,然后第二个DN调用第三个DN,将整个pipeline建立完成,逐级返回客户端
- client就开始传输block(先从磁盘读取数据到本地缓存),以packet为单位,写入到第一台DN的上,期间会将packet传输到下一台DN的pipeline上,写完一块block会进行校验后,返回确认信息
- 写完数据,关闭输出流
- DN发送完成信号给NN((1)强一致性:全DN部都确认(2)最终一致性:只有一台DN确认)
- 继续写第二块block
2、client传输数据到DN流程
在client端向DN传数据的时候,HDFSOutputStream会有一个chunk buff,写满一个chunk后,会计算校验和并写入当前的chunk,之后再把带有检验和的chunk写入packet,当一个packet写满后,packet会进入dataQueue队列,其他的DN就是从这个dataQueue获取client端上传的数据并存储的。同时一个DN成功存储一个packet后会返回一个ack packet,放入ack Queue中
三、HDFS的读流程
- client向NN通信发送读取文件路径,NN会检查元数据所在的DN节点,并返回DN列表
- client挑选最近的一台DN建立输入流
- DN向输入流写数据,以packet为单位
- client接收到packet后先写入本地缓存,再写入目标文件,后面的block块会append到前面的block块,最终形成所需文件
- 关闭流
四、读写过程,数据完成性如何保持
- 通过校验和,因为每个chunk中都会有一个校验位。一个个chunk构成packet,一个个packet最终会形成block,故可在block上求校验和
- 看 二.2 client传输数据到DN流程