第八周学习心得

用户头像
路人
关注
发布于: 2020 年 07 月 29 日

本周的作业是故障恢复,那我就再总结下HDFS的读写流程吧。

1.HDFS的读写流程



注:



block:文件上传前需要分块,这个块就是block,一般为128MB;



packet:packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传数据的基本单位,默认64KB。



chunk:chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Byte,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk写入packet的大小为516Byte。由此可见真实数据与校验值数据的比值约为128 : 1。(即64*1024 / 512)



HDFS的写流程:



  1. 客户端向NameNode发出写文件请求。

  2. 检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象。

  3. client端按128MB的块切分文件。

  4. client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。(注:并不是写好一个块或一整个文件后才向后分发)

  5. 每个DataNode写完一个块后,会返回确认信息。

  6. 写完数据,关闭输出流。

  7. 发送完成信号给NameNode。(注:发送完成信号的时机取决于集群是强一致性还是最终一致性,强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报,HDFS一般情况下都是强调强一致性)



HDFS的读流程:



  1. client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象。

  2. 就近挑选一台datanode服务器,请求建立输入流 。

  3. DataNode向输入流中中写数据,以packet为单位来校验。

  4. 关闭输入流



用户头像

路人

关注

还未添加个人签名 2018.07.26 加入

还未添加个人简介

评论 (1 条评论)

发布
用户头像
结合作业的扩展很赞啊
2020 年 08 月 01 日 09:58
回复
没有更多了
第八周学习心得