浅谈大数据-HDFS的读写流程(无图)

一、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、整体写流程

  1. client向NN(NameNode)发送写文件请求,NN会检查目标文件是否存在,以及目录是否存在
  2. NN检验完返回可以上传
  3. client会将文件(例:130M)切分成为两块block(128M ,2M),请求上传第一块block
  4. NN返回DN服务器列表(可以存储的DN列表)
  5. client请求一台DN上传数据(RPC调用,建立pipeline),第一个DN收到请求会继续调用第二个DN,然后第二个DN调用第三个DN,将整个pipeline建立完成,逐级返回客户端
  6. client就开始传输block(先从磁盘读取数据到本地缓存),以packet为单位,写入到第一台DN的上,期间会将packet传输到下一台DN的pipeline上,写完一块block会进行校验后,返回确认信息
  7. 写完数据,关闭输出流
  8. DN发送完成信号给NN((1)强一致性:全DN部都确认(2)最终一致性:只有一台DN确认)
  9. 继续写第二块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的读流程

  1. client向NN通信发送读取文件路径,NN会检查元数据所在的DN节点,并返回DN列表
  2. client挑选最近的一台DN建立输入流
  3. DN向输入流写数据,以packet为单位
  4. client接收到packet后先写入本地缓存,再写入目标文件,后面的block块会append到前面的block块,最终形成所需文件
  5. 关闭流

四、读写过程,数据完成性如何保持

  1. 通过校验和,因为每个chunk中都会有一个校验位。一个个chunk构成packet,一个个packet最终会形成block,故可在block上求校验和
  2. 看 二.2 client传输数据到DN流程
上一篇:android列表侧滑删除&置顶,安卓开发项目实例


下一篇:好好说话之Tcache Attack(2):tcache dup与tcache house of spirit