探索HDFS读写流程、节点机制和数据完整性

目录

  • 写在前面
  • 一、HDFS的读写流程
    • 1.1 HDFS写数据流程
    • 1.2 机架感知
    • 1.3 HDFS读数据流程
    • 1.4 小结
  • 二、 NameNode和SecondaryNameNode
    • 2.1 NN和2NN工作机制
    • 2.2 Fsimage和Edits解析
      • 2.2.1 oiv查看Fsimage文件
      • 2.2.2 oev查看Edits文件
    • 2.3 CheckPoint时间设置
  • 三、DataNode
    • 3.1 DataNode工作机制
    • 3.2 数据完整性
    • 3.3 掉线时限参数设置

写在前面

Hadoop分布式文件系统(HDFS)是一种适用于大数据处理的分布式文件系统。在HDFS中,数据被分割成块并分布在多台机器上存储,以实现高容量、高可靠性和高吞吐量的数据存储和处理。以下是关于HDFS的读写流程、NameNode和Secondary NameNode、DataNode的简单介绍。

一、HDFS的读写流程

1.1 HDFS写数据流程

(1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode审核权限、剩余空间后,满足条件允许写入;
(2)客户端请求第一个 Block上传到哪几个DataNode服务器上;
(3)NameNode返回3个DataNode节点,分别为dn1、dn2、dn3;
(4)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
(5)dn1、dn2、dn3逐级应答客户端。
(6)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
(7)当一个Block传输完成之后,客户端再次请求NameNode上传下一个Block的服务器。(重复执行2-7步)。

注意:

  • NameNode不负责数据的写入,只负责元数据记录和权限审批
  • 客户端直接向一台DateNode写数据,这个DateNode一般是离客户端最近(网络距离)的那一个
  • 数据块副本的复制工作,由DateNode之间自行完成(构建一个PipLine,按顺序复制分发)

1.2 机架感知

HDFS通过机架感知来提高数据的读写性能和可靠性。机架感知是指在选择数据副本节点时,将优先选择同一机架内的节点,以减少数据跨机架传输的延迟和带宽消耗。具体的机架感知策略可以通过配置文件进行调整。

在这里插入图片描述
简单来说就是,当文件副本数为三时,HDFS的放置策略是,如果写入程序位于数据节点上,则将一个副本放置在本地机器上,否则放置在与写入程序位于同一机架中的随机数据节点上、另一个副本放在不同(远程)机架中的节点上,最后一个副本则放在同一远程机架中的不同节点上。

1.3 HDFS读数据流程

(1)客户端通过DistributedFileSystem向NameNode请求读取某文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
(2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
(3)DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
(4)客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。

1.4 小结

  • 客户端读写HDFS的数据流程简单来说:
    • 不管是都还是写,NameNode都不经手数据,均是客户端和DataNode直接通讯,不然对NameNode的压力太大
    • NameNode做授权判断(是否能写、是否能读)
    • 客户端直连DataNode进行写入、客户端直连DataNode进行block读取
    • 写入,客户端会被分配找距离自己最近的DataNode写数据
    • 读取,客户端拿到的Block列表会事网络距离最近的一份

二、 NameNode和SecondaryNameNode

2.1 NN和2NN工作机制

思考:NameNode中的元数据是存储在哪里的?
首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage。
这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。
但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。

  1. 第一阶段:NameNode启动
  • 第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
  • 客户端对元数据进行增删改的请求。
  • NameNode记录操作日志,更新滚动日志。
  • NameNode在内存中对元数据进行增删改。
  1. 第二阶段:Secondary NameNode工作
  • Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
  • Secondary NameNode请求执行CheckPoint。
  • NameNode滚动正在写的Edits日志。
  • 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
  • Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
  • 生成新的镜像文件fsimage.chkpoint。
  • 拷贝fsimage.chkpoint到NameNode。
  • NameNode将fsimage.chkpoint重新命名成fsimage。

2.2 Fsimage和Edits解析

NameNode被格式化之后,将在/opt/module/hadoop-3.2.4/data/dfs/name/current目录中产生如下文件:

在这里插入图片描述

FsImage文件:HDFS文件系统元数据的一个永久性检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息。
Edits文件:存放HDFS文件系统的所有更改操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
seen_txid文件:保存的是一个数字,即最后一个edits的数字。

每次NameNode启动的时候都会将FsImage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成NameNode启动的时候就将FsImage和Edits文件进行了合并。

2.2.1 oiv查看Fsimage文件

(1)查看oiv和oev命令

[amo@hadoop102 current]$ hdfs
oiv            apply the offline fsimage viewer to an fsimage
oev            apply the offline edits viewer to an edits file

(2)基本语法
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
(3)案例实操

[amo@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000877 -o /opt/module/fsimage.xml
2024-03-12 22:08:53,287 INFO offlineImageViewer.FSImageHandler: Loading 5 strings
2024-03-12 22:08:53,329 INFO namenode.FSDirectory: GLOBAL serial map: bits=29 maxEntries=536870911
2024-03-12 22:08:53,329 INFO namenode.FSDirectory: USER serial map: bits=24 maxEntries=16777215
2024-03-12 22:08:53,329 INFO namenode.FSDirectory: GROUP serial map: bits=24 maxEntries=16777215
2024-03-12 22:08:53,329 INFO namenode.FSDirectory: XATTR serial map: bits=24 maxEntries=16777215
[amo@hadoop102 current]$ cat /opt/module/fsimage.xml

思考:Fsimage中没有记录块所对应DataNode,为什么?

在集群启动后,要求DataNode上报数据块信息,并间隔一段时间后再次上报。

2.2.2 oev查看Edits文件

(1)基本语法
hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
(2)案例实操

[amo@hadoop102 current]$ hdfs oev -p XML -i edits_0000000000000000876-0000000000000000877 -o /opt/module/edits.xml
[amo@hadoop102 current]$ cat /opt/module/edits.xml 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EDITS><EDITS_VERSION>-65</EDITS_VERSION><RECORD><OPCODE>OP_START_LOG_SEGMENT</OPCODE><DATA><TXID>876</TXID></DATA></RECORD><RECORD><OPCODE>OP_END_LOG_SEGMENT</OPCODE><DATA><TXID>877</TXID></DATA></RECORD>
</EDITS>
[amo@hadoop102 current]$ 

思考:NameNode如何确定下次开机启动的时候合并哪些Edits?

2.3 CheckPoint时间设置

  1. 通常情况下,SecondaryNameNode每隔一小时执行一次。
    [hdfs-default.xml]
<property><name>dfs.namenode.checkpoint.period</name><value>3600s</value>
</property>
  1. 一分钟检查一次操作次数,当操作次数达到1百万时,SecondaryNameNode执行一次。
<property><name>dfs.namenode.checkpoint.txns</name><value>1000000</value>
<description>操作动作次数</description>
</property><property><name>dfs.namenode.checkpoint.check.period</name><value>60s</value>
<description> 1分钟检查一次操作次数</description>
</property>

三、DataNode

3.1 DataNode工作机制

  1. 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
  2. DataNode启动后向NameNode注册,通过后,周期性(6小时)的向NameNode上报所有的块信息。
    ⦁ DN向NN汇报当前解读信息的时间间隔,默认6小时;
<property><name>dfs.blockreport.intervalMsec</name><value>21600000</value><description>Determines block reporting interval in milliseconds.</description>
</property>

⦁ DN扫描自己节点块信息列表的时间,默认6小时

<property><name>dfs.datanode.directoryscan.interval</name><value>21600s</value><description>Interval in seconds for Datanode to scan data directories and reconcile the difference between blocks in memory and on the disk.Support multiple time unit suffix(case insensitive), as describedin dfs.heartbeat.interval.</description>
</property>
  1. 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
  2. 集群运行中可以安全加入和退出一些机器。

3.2 数据完整性

思考:如果电脑磁盘里面存储的数据是控制高铁信号灯的红灯信号(1)和绿灯信号(0),但是存储该数据的磁盘坏了,一直显示是绿灯,是否很危险?同理DataNode节点上的数据损坏了,却没有发现,是否也很危险,那么如何解决呢?

如下是DataNode节点保证数据完整性的方法。

  • 当DataNode读取Block的时候,它会计算CheckSum。
  • 如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
  • Client读取其他DataNode上的Block。
  • 常见的校验算法crc(32),md5(128),sha1(160)
  • DataNode在其文件创建后周期验证CheckSum。

3.3 掉线时限参数设置

需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。

<property><name>dfs.namenode.heartbeat.recheck-interval</name><value>300000</value>
</property><property><name>dfs.heartbeat.interval</name><value>3</value>
</property>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例分析篇14:信息系统安全设计考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

Unity URP 如何写基础的几何着色器

这是使用几何着色器在点中心生成一个点并根据这个点把原本的面片分成三个三角形的操作。 对于几何着色器构造相对简单&#xff0c;网上的信息也相对较多&#xff0c;需要注意的点就是需要提供一个新的数据结构供几何着色器输出&#xff0c;因为几何着色器在顶点之后&#xff0…

哈达玛矩阵与克罗内克积

哈达玛矩阵与克罗内克积在计算机视觉中发挥着重要作用,例如哈希感知等场景下都可能用到这两个知识点。 例如: 论文:Visually meaningful image encryption scheme based on new-designed chaotic map and random scrambling diffusion strategy 中有一句: “Construct a Ha…

UVC 设备框架在 Linux 4.15 内核的演变

1. 概述 发现之前的uvc框架和现在的还是有一些差别的&#xff08;比如从videobuf 过渡到videobuf2&#xff09;&#xff0c;写个blog记录一下&#xff0c;方便以后查询&#xff0c;我的内核版本&#xff1a;Linux 4.15 UVC&#xff08;USB Video Class&#xff09;设备框架是…

探秘Nutch:揭秘开源搜索引擎的工作原理与无限应用可能(三)

本系列文章简介&#xff1a; 本系列文章将带领大家深入探索Nutch的世界&#xff0c;从其基本概念和架构开始&#xff0c;逐步深入到爬虫、索引和查询等关键环节。通过了解Nutch的工作原理&#xff0c;大家将能够更好地理解搜索引擎背后的原理&#xff0c;并有能力利用Nutch构建…

Idea、VsCode、WebStorm常用插件

持续更新&#xff0c;见&#xff1a;工具库/Idea、VsCode、WebStorm常用插件.md 1. Idea 常用插件 MybatisX&#xff1a;mybatis选手必备&#xff0c;一键跳转&#xff0c;自动生成&#xff0c;节省开发效率。&#xff08;Java玩家必备&#xff09; GitToolBox&#xff1a;gi…

CPU服务器安装运行智谱大模型ChatGLM-6B

CPU运行智谱大模型ChatGLM-6B 说明 我的服务器配置是16C32G&#xff0c;跑大模型最好内存要大一些才行&#xff0c;不然跑不起来。 下载 git clone https://github.com/THUDM/ChatGLM-6B.git 安装依赖包 pip install -r requirements.txt 下载模型文件 在huggingface上…

什么是Java中的接口?

Java中的接口 在Java编程语言中&#xff0c;接口是一种定义方法但不包含方法实现的抽象类型。它是一组抽象方法的集合&#xff0c;这些方法通常由实现该接口的类来具体实现。接口在Java中扮演着非常重要的角色&#xff0c;尤其是在面向对象的设计和编程中。接口定义了类应该遵…

Leetcode 3.12

leetcode hot 100 链表1.两两交换链表中的节点2.随机链表的复制3.排序链表 链表 1.两两交换链表中的节点 两两交换链表中的节点 1.必须要设置一个dummy (temp) 结点2.保存第二个节点3.先让第一个节点指向第三个节点4.再让第二个节点指向第一个节点5.最后让dummy指向第二个节点…

蓝鲸作业平台升级openssh执行方案分享

本文来自腾讯蓝鲸智云社区用户&#xff1a;AK47 蓝鲸的运维系统在我们单位使用已经快四个年头了&#xff0c;从刚开始的5到现在最新的7.1都有部署、测试、验证和使用。在实际的使用过程中&#xff0c;给我们运维提供了非常大的帮助。其中有一个场景分享给大家。这个场景是关于o…

从SQL质量管理体系来看SQL审核(1)

经常看到一些SQL审核产品宣称自己有多少条审核规则&#xff0c;似乎规则数目多少是衡量SQL审核工具能力的标准。事实真的如此吗&#xff1f;肯定不是&#xff0c;那我们该如何评价一个SQL审核工具呢&#xff1f; SQL脚本和Java/C等编程脚本一样&#xff0c;都是程序代码&#…

接口测试工具【Postman】相关的面试题

Postman是一种接口调试与http接口测试的工具&#xff0c;可以非常方便的模拟get、post或其他请求来调试和测试接口 文章目录 Postman优点Postman使用流程Postman参数化有哪几种方式Postman如何设置关联 Postman优点 1.支持各种请求类型&#xff1a;get、post、put、patch、del…

Linux——磁盘文件

磁盘文件 通过前一篇文章Linux——系统文件I/O&#xff0c;我们知道了如何对加载在内存中的文件进行读写等操作&#xff0c;并了解了其内在的原理。同时我们也应该清楚&#xff0c;并不是所有的文件都会被加载入内存&#xff0c;而没有被加载入内存的文件&#xff0c;就被存放…

酷开科技智慧AI助力酷开系统千屏千面

每台智能电视都有一个专属的操作系统&#xff0c;而酷开系统作为一款基于人工智能技术的智能电视操作系统&#xff0c;深受大众喜爱&#xff0c;其最大的特点就是“千屏千面”。这意味着每一位消费者在使用酷开系统时&#xff0c;通过酷开科技的智慧AI&#xff0c;都能根据自己…

常用网络命令的使用

1.Ping 命令 Ping 命令用于测试网络连接的程序。Ping 是工作在 TCP/IP 网络体系结构中应用层的一个服务命令&#xff0c;主要是向特定目的主机发送 ICMP (Internet Control Message Protocol&#xff0c;因特网报文控制协议 )Echo 请求报文&#xff0c;测试目的站是否可达及了…

用户管理测试用例

1. 功能测试&#xff1a; 用户管理页面测试 1、左侧为组织机构树 2、列表上方为功能按钮&#xff0c;分别有&#xff1a;添加、删除、启用、禁用、导入导出、移动、批量修改属性 3、列表组成有&#xff1a;复选框、用户、状态、真实姓名、组织机构、手机、邮箱 4、页面右上方…

Prometheus监控Mysql数据库在Grafana展示

未安装prometheus和Grafana可以参考这个博客操作 Docker安装Prometheus监控-CSDN博客 Windows版本数据库 一、在数据库服务器安装mysqld-exporter 下载mysqld-exporter文件 Releases prometheus/mysqld_exporter GitHub 二、配置mysqld-exporter文件 1、解压进入mysqld…

docker+elasticsearch

一&#xff0c;环境准备&#xff1a;安装docker&#xff08;往期文章&#xff09; 二&#xff0c;elasticsearch简介&#xff1a; 用于储存数据 三&#xff0c;部署&#xff1a; 1&#xff09;&#xff0c;拉取镜像 使用本作者提供的java17镜像 2&#xff09;&#xff0c;…

ARM64汇编05 - MOV系列指令

MOV(wide immediate) MOV 可以将一个立即数移动到寄存器中。 .text:0000000000000834 80 46 82 D2 MOV X0, #0x1234 ; Keypatch modified this from:MOV X0, #0x1234 对应的汇编代码为&#xff1a;80 46 82 D2 看手册可知&#xf…

Unity制作马赛克效果

大家好&#xff0c;我是阿赵。   之前在玩怒之铁拳4里面&#xff0c;看到了马赛克场景转换的效果&#xff0c;觉得很有趣&#xff0c;于是也来做一下。 一、2D版本的马赛克转场效果 先看看视频效果&#xff1a; 马赛克转场 这里我是直接写shader实现的&#xff0c;我这里是把…