• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

HDFS读写流程+NameNode和DataNode工作机制

武飞扬头像
weixin_46628668
帮助1

HDFS写数据流程

  1. 客户端向NameNode请求上传文件,NameNode返回数据节点(考虑节点距离和负载均衡等)
  2. 客户端创建FSDataOutputStream(先以512字节的chunk为单位,然后传输是以64k的packet为单位),向DataNode建立Block传输管道
  3. 向DataNode传数据是接力的形式,即先向DataNode1传,然后DataNode1向DataNode2传,以此类推。向每个DataNode传数据的时候,一边在自己磁盘写,一边向下一个DataNode传。
  4. 传输完毕后,客户端将自己的ACK队列中的packet删除,如果没有发送成功,会将packet放入发送队列再发送。

学新通节点距离计算

节点距离:两个节点到达最近的共同祖先的距离之和

学新通 机架感知

客户端到底往那几个DataNode写数据,由NameNode告诉他,副本节点选择策略如下:

  1. 本地节点
  2. 其他机架的一个节点
  3. 其他机架(跟第二个副本同一个机架)的另一个节点

源码在BlockPlacementPolicyDefault的chooseTargetInOrder方法中。

学新通

HDFS读数据流程

  1. 客户端向NameNode请求下载文件,NameNode返回元数据
  2. 客户端创建FSDataIntputStream,从DataNode读数据,如果一个DataNode负载很大,会从其他DataNode读取
  3. 读数据时,会按照block顺序串行读取

学新通NameNode工作机制

NameNode的数据是存储在内存还是磁盘?内存读取速度快,但是可靠性低,而磁盘正好相反。HDFS的NameNode采取两者结合的方式工作:用fsImage镜像文件存储数据,用edit文件存储变更操作。每次断电又上电重启,会根据fsImage镜像文件和edit文件快速生成之前内存中的数据。如果操作很多,会造成edit文件很大,因此SecondaryNameNode会定时(或者当edit文件很大时)将fsImage镜像文件和edit文件成新的fsImage镜像文件。新的fsImage镜像文件会覆盖原来的镜像文件,但是edit文件好像会一直存在,而且会有一个正在运行(还未合并)的edit文件(名称中带有inprogress)。

学新通 

FsImage镜像文件:HDFS文件系统的元数据的一个永久性的检查点,包含HDFS文件系统的所有目录和文件的inode序列化信息

查看命令:hdfs oiv -p 文件类型(eg: XML) -i fsimage的文件路径 -o 输出文件的路径

学新通

 Edits文件:存放HDFS文件系统的所有更新操作/写操作

查看命令:hdfs oev -p 文件类型(eg: XML) -i edits的文件路径 -o 输出文件的路径

学新通

seen_txid文件:保存一个数字,即最后一个edits_的数字

SecondaryNameNode定时合并设置

在hdfs-default.xml中的dfs.namenode.checkpoint.period值,默认为3600s

学新通

 当edits文件记录的操作次数达到100 0000次时,也会进行合并,在hdfs-default.xml中的dfs.namenode.checkpoint.txns值,SecondaryNameNode会每隔60s检查edits文件记录的操作次数,在hdfs-default.xml中的dfs.namenode.checkpoint.check.period值。 

学新通

DataNode工作机制

HDFS集群启动后,DataNode会主动向NameNode汇报信息(自己的数据块信息、校验和等),然后周期性上报这些信息(默认周期为6h),同时NameNode和DataNode间会有心跳检测(看DataNode是否还活着),每隔3s进行一次,如果某次心跳检测失败了,不立即判定该DataNode挂了,而是等10分钟30s进行,如果10分钟30s还未收到DataNode的心跳,则认为该DataNode挂了。

学新通 

掉线时限参数设置

上面提到的每隔6h,DataNode会向NameNode汇报块信息,这个6h位于hdfs-default.xml中的dfs.blockreport.intervalMsec值,当然如果要修改这个设置,最好连dfs.datanode.directoryscan.interval也一起修改,后者表示DataNode定时扫描自己块信息的周期。

学新通

心跳检测3s是在hdfs-default.xml中的dfs.heartbeat.interval值,而10分钟30s是由以下公式计算出来的:TimeOut = 2 * dfs.namenode.heartbeat.recheck-interval 10 * dfs.heartbeat.interval

学新通

数据完整性校验

从HDFS下载文件时,会发现有一个.crc后缀的文件,这个就是校验文件,一般数据校验算法默认是crc(循环冗余校验)。

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfkifeg
系列文章
更多 icon
同类精品
更多 icon
继续加载