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

news2024/11/26 18:55:01

目录

  • 写在前面
  • 一、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 described
	in 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.coloradmin.cn/o/1511584.html

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

相关文章

每日一题——LeetCode2129.将标题首字母大写

方法一 个人方法 将字符串转为数组&#xff0c;遍历数组&#xff0c;对数组的每一个元素&#xff0c;先全部转为小写&#xff0c;如果当前元素长度大于2&#xff0c;将第一个字符转为大写形式 var capitalizeTitle function(title) {titletitle.split( )for(let i0;i<tit…

[嵌入式系统-37]:龙芯1B 开发学习套件 -6-协处理器CP0之CPU异常处理与外部中断控制器的中断处理

目录 一、MPIS CPU Core与32个异常exception 1.1 龙芯1B的MIPS CPU IP Core 1.2 MIP32指令系统 1.3 MIPS CPU寄存器 1.4 龙芯异常exception与中断interrupt的区别 1.5 向量中断与非向量中断 1.6 MIPS CPU的异常向量与异常向量号&#xff1a;向量中断的支持 二、协议处理…

PAT-素数专题、质因子分解、大整数计算

素数专题 1007.素数对的猜想 让我们定义dn​为&#xff1a;​ &#xff0c;其中pi​是第i个素数。显然有d1​1&#xff0c;且对于n>1有dn​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N(<105)&#xff0c;请计算不超过N的满足猜想…

新火种AI|在撕裂中求前进:OpenAI最近的日子,属实不太好过。

作者&#xff1a;小岩 编辑&#xff1a;彩云 伴随着ChatGPT 火遍全球&#xff0c;OpenAI俨然成为了备受全世界关注的主角。因为有横空出世的GPT-4&#xff0c;重磅炸弹视频生成模型Sora等产品&#xff0c;OpenAI始终都是以行业霸主的姿态出现在人们的视野中。也正是因为OpenA…

vue使用elementPlus ui框架,如何给Dialog 对话框添加Loading 自定义类名显示隐藏

vue使用elementPlus ui框架时&#xff0c;如何给Dialog 对话框添加Loading 自定义类名&#xff0c;想要实现dialog对话框区域有loading效果 官方给出的这个API配置项customClass&#xff0c;使用不太明确。暂时无法实现绑定class。 最后的实现方式&#xff1a; <template&…

数据分析-Pandas如何观测数据的中心趋势度

数据分析-Pandas如何观测数据的中心趋势度 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据…

Redis中的缓存设计

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c;缓存层和存储层都不会命中&#xff0c;通常处于容错的考虑&#xff0c;如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c;失去了缓存保护后端存储的意义。…

基于PyTorch深度学习实战入门系列-Numpy基础全

Numpy的使用 导入Numpy模块 import numpy as np创建数组&#xff08;一维数组、小数数组、二维数组&#xff09; # 创建一个一维数组 n1 np.array([1, 2, 3]) # 创建一个含有小数的一维数组 n2 np.array([0.1, 0.2, 0.3]) # 创建一个简单的二维数组 n3 np.array([[1, 2], [3…

Apache SkyWalking 监控 Linux 实战

SkyWalking 从 8.4 版本开始支持监控主机&#xff0c;用户可以轻松从 dashboard 上检测可能的问题&#xff0c;例如当 CPU 使用过载、内存或磁盘空间不足或者当网络状态不健康时等。 与监控 MySQL Server 类似&#xff0c;SkyWalking 也是利用 Prometheus 和 OpenTelemetry 收集…

数据结构-链表(一)

一、链表简介 链表&#xff08;Linked List&#xff09;是一种常见的数据结构&#xff0c;用于存储和组织数据。与数组不同&#xff0c;链表的元素&#xff08;节点&#xff09;在内存中不必连续存储&#xff0c;而是通过指针链接在一起。 链表由多个节点组成&#xff0c;每个…

C++day2——引用、结构体、类

思维导图&#xff1a; 2、自己封装一个矩形类(Rect)&#xff0c; 拥有私有属性&#xff1a;宽度(width)、高度(height)&#xff0c; 定义公有成员函数初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w)更改高度的函数:set_h(int h) 输出该矩形的周长和面积函…

逆向案例七——中国天气质量参数搜不到加密,以及应对禁止打开开发者工具和反debuger技巧

进入相关城市数据页面&#xff0c;发现不能调试 应对方法&#xff0c;再另一个页面&#xff0c;打开开发者工具&#xff0c;选择取消停靠到单独页面 接着&#xff0c;复制链接在该页面打开。接着会遇到debugger 再debugger处打上断点&#xff0c;一律不在此处暂停。 然后点击继…

数据结构中的堆(Java)

文章目录 把普通数组转换大顶堆数组堆增删改查替换堆排序 把普通数组转换大顶堆数组 该方式适用索引为0起点的堆 在堆&#xff08;Heap&#xff09;这种数据结构中&#xff0c;节点被分为两类&#xff1a;叶子节点&#xff08;Leaf Nodes&#xff09;和非叶子节点&#xff08;N…

springboot的Converter和HttpMessageConveter

Converter和HttpMessageConveter是springboot和springmvc在处理请求的时候需要用到的。但是这两者的完全是不一样的&#xff0c;作用的地方也不一样。 1&#xff0c;springboot和springmvc处理请求的流程 先来回顾一下处理请求的流程&#xff1a; 用户向服务器发送请求&#…

云原生应用(2)之使用容器运行Nginx应用及Docker命令

一、使用Docker容器运行Nginx 1.1 使用docker run命令运行Nginx应用 1.1.1 观察下载容器镜像过程 查找本地容器镜像文件&#xff1b; 执行命令过程一&#xff1a;下载容器镜像 # docker run -d nginx:latest Unable to find image nginx:latest locally latest: Pulling from…

软考72-上午题-【面向对象技术2-UML】-UML中的图3

一、状态图 1-1、状态图的定义 状态图&#xff0c;展现了一个状态机&#xff0c;由&#xff1a;状态、转换、事件和活动组成&#xff0c;是系统的动态视图。 活动(动作) 可以在状态内执行也可以在状态转换(迁移) 时执行。 状态图强调&#xff1a;行为的事件顺序。 1-2、状态图…

【ollama】(4):在autodl中安装ollama工具,配置环境变量,修改端口,使用RTX 3080 Ti显卡,测试coder代码生成大模型

1&#xff0c;ollama项目 Ollama 是一个强大的框架&#xff0c;设计用于在 Docker 容器中部署 LLM。Ollama 的主要功能是在 Docker 容器内部署和管理 LLM 的促进者&#xff0c;它使该过程变得非常简单。它帮助用户快速在本地运行大模型&#xff0c;通过简单的安装指令&#xf…

【考研数学】660/880/1000/1800 使用手册

开门见山&#xff0c;直接介绍几个热门的习题册 660&#xff1a;660表面上叫基础通关660&#xff0c;但实际上很多题的难度并不适合基础阶段&#xff0c;建议在强化阶段搭配着 严选题做660&#xff0c;对提升做小题的速度和能力非常有帮助。 880&#xff1a;题量适中&#xf…

20240312-1-Graph(图)

Graph(图) 在面试的过程中,一般不会考到图相关的问题,因为图相关的问题难,而且描述起来很麻烦. 但是也会问道一下常见的问题,比如,最短路径,最小支撑树,拓扑排序都被问到过. 图常用的表示方法有两种: 分别是邻接矩阵和邻接表. 邻接矩阵是不错的一种图存储结构,对于边数相对顶点…

MooC下载pdf转为ppt后去除水印方法

1、从MooC下载的课件&#xff08;一般为pdf文件&#xff09;可能带有水印&#xff0c;如下图所示&#xff1a; 2、将pdf版课件转为ppt后&#xff0c;同样带有水印&#xff0c;如下图所示&#xff1a; 3、传统从pdf中去除水印方法不通用&#xff0c;未找到有效去除课件pdf方法…