当前位置: 首页 > news >正文

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

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(循环冗余校验)。

 

相关文章:

  • 百战c++(数据库2)
  • GO语法学习
  • 【国庆活动】Tomcat 的优化方式
  • Vue3 reactive响应式原理详解
  • 基于HAL库的STM32的串口DMA发送数据(解决只发送一次数据)及DMA+空闲中断接受数据
  • 【图灵MySQL】SQL底层执行原理详解
  • 【电磁】基于Matlab求解瞬变电磁TEM层状介质正演
  • Unity使用新输入系统InputSystem制作飞机大战Demo(敌人生成管理器UI场景跳转)
  • Python 文件存储:pickle 和 json 库的使用
  • 【推荐收藏】matplotlib 制作的动态条形图其实很好看
  • 计算机组成原理 ------ 存储系统(1)
  • Open3D (C++) 基于投影点密度的建筑物立面提取
  • SpringCloud Alibaba系列 Nacos(一)
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • JS的精髓,事件详解
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • express如何解决request entity too large问题
  • Github访问慢解决办法
  • HomeBrew常规使用教程
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Koa2 之文件上传下载
  • PhantomJS 安装
  • PV统计优化设计
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 好的网址,关于.net 4.0 ,vs 2010
  • 欢迎参加第二届中国游戏开发者大会
  • 回流、重绘及其优化
  • 记一次和乔布斯合作最难忘的经历
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 系统认识JavaScript正则表达式
  • 小而合理的前端理论:rscss和rsjs
  • C# - 为值类型重定义相等性
  • ​iOS实时查看App运行日志
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #vue3 实现前端下载excel文件模板功能
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (+4)2.2UML建模图
  • (0)Nginx 功能特性
  • (1) caustics\
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (待修改)PyG安装步骤
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)Linux+Windows下安装ffmpeg
  • (正则)提取页面里的img标签
  • ***利用Ms05002溢出找“肉鸡
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net core控制台应用程序初识
  • .NET delegate 委托 、 Event 事件