博客 Hadoop HDFS的存储机制(读写流程)是怎样的?

Hadoop HDFS的存储机制(读写流程)是怎样的?

   数栈君   发表于 2023-06-02 16:09  472  0

NameNode也称为Master,负责管理整个文件系统元数据,是HDFS的核心;

DataNode也称为Slave,负责管理具体文件数据块存储;

Secondary NameNode协助NameNode进行元数据的备份。

HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向NameNode申请来进行。


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/5faedd1877c12c26a4373c3bf585441b..jpg


1. HDFS写数据流程


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/905d665f1aaab5dee2ebec5f37c7cdf7..jpg


详细步骤解析:

1、client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传;

2、client请求第一个 block该传输到哪些DataNode服务器上;

3、NameNode根据配置文件中指定的备份数量及副本放置策略进行文件分配,返回可用的DataNode的地址,如:A,B,C;

注:默认存储策略由BlockPlacementPolicyDefault类支持。也就是日常生活中提到最经典的3副本策略。

1st replica 如果写请求方所在机器是其中一个datanode,则直接存放在本地,否则随机在集群中选择一个datanode.

2nd replica 第二个副本存放于不同第一个副本的所在的机架.

3rd replica 第三个副本存放于第二个副本所在的机架,但是属于不同的节点


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/b3be5b15f0805086ad49852ccd5a22bd..jpg


4、client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client;

5、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。

6、数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipeline ack发送给client;

7、当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。


2. HDFS读数据流程


http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/1829a105ee87869ccd83a91991aa5ed2..jpg


详细步骤解析:

1、Client向NameNode发起RPC请求,来确定请求文件block所在的位置;

2、NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址;

3、这些返回的DN地址,会按照集群拓扑结构得出DataNode与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client近的排靠前;心跳机制中超时汇报的DN状态为STALE,这样的排靠后;

4、Client选取排序靠前的DataNode来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据;

5、底层上本质是建立FSDataInputStream,重复的调用父类DataInputStream的read方法,直到这个块上的数据读取完毕;一旦到达块的末尾,DFSInputStream 关闭连接并继续定位下一个块的下一个 DataNode;

6、当读完列表的block后,若文件读取还没有结束,客户端会继续向NameNode获取下一批的block列表;一旦客户端完成读取,它就会调用 close() 方法。

7、读取完一个block都会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该block副本的DataNode继续读。

8、NameNode只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;

最终读取来所有的block会合并成一个完整的最终文件。

免责申明:

本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群