大数据离线-HDFS-(中)读写原理解析
本次介绍HDFS,分为上,中,下,三篇
- 上篇入HDFS门介绍,常用操作
- 中篇为HDFS的读写原理介绍
- 下篇为HDFS的测试Demo,常用API
1. NameNode概述
HDFS 的核心,也称为 Master。
存储内容:存储 HDFS 的元数据: 存储并跟踪目录树结构文件,Block信息及位置
存储方式:不持久化存储DataNode的信息,这些信息会在系统启动时从数据节点重建。
性能要求: NameNode 所在机器通常会配置有大量内存(RAM)。 NameNode 是 Hadoop 集群中的单点故障。
2. DataNode概述
负责将实际数据存储在 HDFS 中。称为 Slave。
定期心跳:和NameNode 保持不断通信。启动时,它将自己发布到 NameNode 并汇报自己负责持有的块列表。定期(dfs.heartbeat.interval 配置项配置,默认是 3 秒)向NameNode 发送心跳
失效判定:如果 NameNode 长时间没有接受到 DataNode 发送的心跳, NameNode 就会认为该 DataNode 失效。
单节点故障处理方式:当某个 DataNode 关闭时,它不会影响数据或群集的可用性。 NameNode 将安排由其他 DataNode 管理的块进行副本复制。
性能要求:所在机器通常配置有大量的硬盘空间。因为实际数据存储在DataNode 中。
block 汇报时间间隔取参数 dfs.blockreport.intervalMsec,参数未配置的
话默认为 6 小时.
3. HDFS存储数据原理
首先介绍HDFS的工作机制
- NameNode 负责管理整个文件系统元数据;
- DataNode 负责管理具体文件数据块存储;
- Secondary NameNode 协助 NameNode 进行元数据的备份。
HDFS 的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向NameNode 申请来进行。
写入数据原理图
-
写入数据步骤
client 发起文件上传请求,通过 RPC 与 NameNode 建立通讯
NameNode检查目标文件是否已存在,父目录是否存在
返回是否可以上传的响应
Cilent请求第一个Block应该上传到哪个DataNode
NameNode 根据配置文件中指定的备份数量及机架感知原理进行文件分配,注意:在hadoop设计时候考虑到安全于高效,数据文件默认在HDFS上存储3份,存储策略为本地一份,同机内其它某一节点上一份,不同机架的某一节点上一份,
返回可用的DateNode地址:DatenNode1,DataNode2,DtaNode3
client 请求 3 台 DataNode中的一台 DateNode1上传数据(本质上是一个 RPC 调用,建立 pipeline),DateNode1收到请求会继续调用DateNode2,然后DateNode2调用DateNode2;
将整个pipeline 建立完成, 后逐级返回 client.
Client开始向DataNode1写入数据Block-1(先从本地磁盘放入本地内存缓存),以packet为单位(默认64K),
DateNode1将数据保存,再将数据传输给DataNode2保存,再传输DataNode3
在pipiline的反方向上会进行数据保存结果的校验,逐个发送ack(命令正确应答)
最终由DateNode1将ack发送给客户端,数据保存完成。
核心点是文件的分配
4.HDFS读取数据原理
读取数据原理图
-
读取数据步骤
- Client 向 NameNode 发起 RPC 请求, 来确定请求文件 block 所在的位置;
-
返回数据排序
- 返回数据: NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址;
-
排序: 这些返回的DN地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,
排序两个规则: - 网络拓扑结构中距离 Client 近的排靠前;
- 心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
底层本质上建立的是Scoket Stream,重复的调用父类的DateInputStream的read方法,知道这个块上的数据读取完毕,再获取下一个Block,进行进行重复工作。
读取完成每一个Block,都会进行checksum验证。如果读取DateNode时候出现错误,Client会从下一个拥有这个副本的节点中进行读取。- 读取完成后最终对Block进行合并,产生完整的a.txt
HDFS的读取和写入流程简介完成,更多的详情,需要去再源代码中进行读取。
本博客会持续推出大数据学习的完整教程,有兴趣的同学可以关注,也可以留言评论,联系博主获取更多资料,免费噢!