【Hadoop】DataNode 详解

news2024/11/24 13:59:09

🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁

🦄 个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁

感谢点赞和关注 ,每天进步一点点!加油!

目录

一、DataNode简介

二、DataNode工作机制

三、DataNode文件结构

四、HDFS中的chunk、packet和block

五、心跳机制


一、DataNode简介


Datanode是HDFS文件系统的工作节点,它们根据客户端或者是namenode的调度进行存储和检索数据,并且定期向namenode发送它们所存储的块(block)的列表。

NameNode上并不永久保存哪个DataNode上有哪些数据块的信息,而是通过DataNode启动时的上报来更新NameNode上的映射表。

  1. 根据客户端或者是namenode的调度存储和检索数据,并且定期向namenode发送所存储的块(block)的列表
  2. 数据块在DataNode进程所在的节点上以文件的形式存储在本地磁盘上
  •       一个是数据本身
  •       一个是元数据(数据块的长度,块数据的校验和,以及时间戳)

3.维护blockid与DataNode之间的映射信息(元信息)


二、DataNode工作机制


DataNode启动时,每个datanode对本地磁盘进行扫描,将本DataNode上保存的block信息汇报给namenode, NameNode在接收到的block信息以及该block所在的datanode信息等保存在内存中。

DataNode启动后向NameNode注册,通过后周期性(1小时)的向NameNode上报所有的块信息。在测试环境我们重启NameNode 可以发现 当元数据上千万时重启花费的时间就会比较久,这是因为NameNode 要将所有的Block 的信息加载到内存中。

  1. 通过向NameNode发送心跳保持与其联系(3秒一次),心跳返回结果带有NN的命令返回的命令为:如块的复制,删除某个数据块, 节点退役block 的移动…..
  2. 如果10分钟没有收到DataNode的心跳,则认为其已经lost,并copy其上的block到其它DataNode
  3. DN在其文件创建后三周进行验证其checkSum的值是否和文件创建时的checkSum值一致

三、DataNode文件结构


DataNode不需要进行格式化,它会在启动时自己创建存储目录,其中关键的文件和目录如下图, " /hadoop/hdfs/data" 为DataNode directories。

当目录中存储的块数量增加到一定规模时,DataNode会创建一个新的目录,用于保存新的块及元数据。当目录中的块数量达到一定数据时(可由dfs.DataNode.numblocks属性值确定)时,便会新建一个子目录subdir*,这样就会形成一个更宽的文件树结构,避免了由于存储大量数据块而导致目录很深,使检索性能免受影响。通过这样的措施,数据节点可以确保每个目录中的文件块数是可控的,也避免了一个目录中存在过多文件。可以看如下两个截图:

DataNode中current目录下的其他文件都有blk_xxxx前缀,它有两种类型:

(1)HDFS中的文件块本身,存储的是原始文件内容;

(2)块的元数据信息(使用.meta后缀标识)。一个文件块由存储的原始文件字节组成,元数据文件由一个包含版本和类型信息的头文件和一系列的区域校验和组成。

in_user.lock表示当前目录已经被使用,实现了一种机制,这样DataNode可以独自使用该目录;

DataNode的VERSION文件和NameNode的非常类似,内容如下:

# 目录版本号
[root@hdp105 ~]# cat   /hadoop/hdfs/data/current/VERSION 
#Wed Aug 09 16:35:41 CST 2023
storageID=DS-162f7349-32c8-4b4b-b99b-95d9e18d93c0
clusterID=CID-53b4def4-a7f9-4c80-812c-6d70f214fa9a
cTime=0
datanodeUuid=73a1565b-dc67-4292-a605-6c5f45f68a2a
storageType=DATA_NODE
layoutVersion=-57
[root@hdp105 ~]# 

具体解释

  •  storageID: 存储 id 号
  •  clusterID : 集群 id, 全局唯一
  • cTime: 属性标记了 datanode 存储系统的创建时间,对于刚刚格式化的存储系统,这个属性为 0; 但是在文件系统升级之后,该值会更新到新的时间戳。
  • datanodeUuid: datanode 的唯一识别码
  • storageType: 存储类型
  • layoutVersion :是一个负整数。 通常只有 HDFS 增加新特性时才会更新这个版本号。

查看该数据块的版本号 /hadoop/hdfs/data/current/BP-566787281-192.168.2.152-1650763442056/current/VERSION :


[root@hdp105 ~]# cat  /hadoop/hdfs/data/current/BP-566787281-192.168.2.152-1650763442056/current/VERSION 
#Wed Aug 09 16:35:41 CST 2023
namespaceID=1378550782    # 第一个连接NameNode 从中获取
cTime=1650763442056        # 与NameNode 值一样 ,属性标记了 datanode 存储系统的创建时间
blockpoolID=BP-566787281-192.168.2.152-1650763442056 
layoutVersion=-57             # 一个负整数

具体解释:

  • namespaceID: 是 datanode 首次访问 namenode 的时候从 namenode 处获取的storageID 对每个 datanode 来说是唯一的(但对于单个 datanode 中所有存储目录来说则是相同的),namenode 可用这个属性来区分不同 datanode。
  •  cTime :属性标记了 datanode 存储系统的创建时间,对于刚刚格式化的存储系统,这个属性为 0; 但是在文件系统升级之后,该值会更新到新的时间戳。
  • blockpoolID: 一个 block pool id 标识一个 block pool,并且是跨集群的全局唯一。当一个新的 Namespace 被创建的时候(format 过程的一部分)会创建并持久化一个唯一 ID。在创建过程构建全局唯一的 BlockPoolID 比人为的配置更可靠一些。NN 将 BlockPoolID 持久化到磁盘中,在后续的启动过程中,会再次 load 并使用。
  • layoutVersion: 是一个负整数。 通常只有 HDFS 增加新特性时才会更新这个版本号。

四、HDFS中的chunk、packet和block


HDFS文件写入流程如下图:

hdfs-site.xml 中 block 大小默认配置

    <property>
      <name>dfs.blocksize</name>
      <value>134217728</value>
    </property>
  • block是最大的一个单位,它是最终存储于DataNode上的数据粒度,由dfs.block.size参数决定,默认是128M;注:这个参数由客户端配置决定;
  • packet是中等的一个单位,它是数据由DFSClient流向DataNode的粒度,以dfs.write.packet.size参数为参考值,默认是64K;注:这个参数为参考值,是指真正在进行数据传输时,会以它为基准进行调整,调整的原因是一个packet有特定的结构,调整的目标是这个packet的大小刚好包含结构中的所有成员,同时也保证写到DataNode后当前block的大小不超过设定值;
  • chunk是最小的一个单位,它是DFSClient到DataNode数据传输中进行数据校验的粒度,由io.bytes.per.checksum参数决定,默认是512B;

注意:事实上一个chunk还包含4B的校验值,因而chunk写入packet时是516B;数据与检验值的比值为128:1,所以对于一个128M的block会有一个1M的校验文件与之对应;

2023-08-26 16:50:24 DEBUG [main] (DFSOutputStream.java:472) - WriteChunk allocating new packet seqno=80, src=/winner/hadoop/winipva/config/temp/siteinfo/000000, packetSize=65016, chunksPerPacket=126, bytesCurBlock=5160960, DFSOutputStream:blk_1074938158_1198973
2023-08-26 16:50:24 DEBUG [main] (DFSOutputStream.java:485) - enqueue full packet seqno: 80 offsetInBlock: 5160960 lastPacketInBlock: false lastByteOffsetInBlock: 5225472, src=/winner/hadoop/winipva/config/temp/siteinfo/000000, bytesCurBlock=5225472, blockSize=134217728, appendChunk=false, blk_1074938158_1198973
2023-08-26 16:50:24 DEBUG [main] (DataStreamer.java:1953) - Queued packet seqno: 80 offsetInBlock: 5160960 lastPacketInBlock: false lastByteOffsetInBlock: 5225472, blk_1074938158_1198973
2023-08-26 16:50:24 DEBUG [main] (DFSOutputStream.java:407) - computePacketChunkSize: src=/winner/hadoop/winipva/config/temp/siteinfo/000000, chunkSize=516, chunksPerPacket=126, packetSize=65016
2023-08-26 16:50:24 DEBUG [main] (DFSOutputStream.java:472) - WriteChunk allocating new packet seqno=81, src=/winner/hadoop/winipva/config/temp/siteinfo/000000, packetSize=65016, chunksPerPacket=126, bytesCurBlock=5225472, DFSOutputStream:blk_1074938158_1198973
2023-08-26 16:50:24 DEBUG [main] (DFSOutputStream.java:485) - enqueue full packet seqno: 81 offsetInBlock: 5225472 lastPacketInBlock: false lastByteOffsetInBlock: 5289984, src=/winner/hadoop/winipva/config/temp/siteinfo/000000, bytesCurBlock=5289984, blockSize=134217728, appendChunk=false, blk_1074938158_1198973
2023-08-26 16:50:24 DEBUG [DataStreamer for file /winner/hadoop/winipva/config/temp/siteinfo/000000 block BP-566787281-192.168.2.152-1650763442056:blk_1074938158_1198973] (DataStreamer.java:627) - nodes [DatanodeInfoWithStorage[192.168.2.154:1019,DS-162f7349-32c8-4b4b-b99b-95d9e18d93c0,DISK], DatanodeInfoWithStorage[192.168.2.152:1019,DS-ff3d5e8b-c345-4ef6-878d-a2b0a6bf30bb,DISK], DatanodeInfoWithStorage[192.168.2.153:1019,DS-0c73463c-22db-49af-82d0-c8b2c010ff00,DISK]] storageTypes [DISK, DISK, DISK] storageIDs [DS-162f7349-32c8-4b4b-b99b-95d9e18d93c0, DS-ff3d5e8b-c345-4ef6-878d-a2b0a6bf30bb, DS-0c73463c-22db-49af-82d0-c8b2c010ff00]
2023-08-26 16:50:24 DEBUG [DataStreamer for file /winner/hadoop/winipva/config/temp/siteinfo/000000 block BP-566787281-192.168.2.152-1650763442056:blk_1074938158_1198973] (DataStreamer.java:769) - blk_1074938158_1198973 sending packet seqno: 0 offsetInBlock: 0 lastPacketInBlock: false lastByteOffsetInBlock: 64512
2023-08-26 16:50:24 DEBUG [DataStreamer for file /winner/hadoop/winipva/config/temp/siteinfo/000000 block BP-566787281-192.168.2.152-1650763442056:blk_1074938158_1198973] (DataStreamer.java:712) - stage=DATA_STREAMING, blk_1074938158_1198973
2023-08-26 16:50:24 DEBUG [DataStreamer for file /winner/hadoop/winipva/config/temp/siteinfo/000000 block BP-566787281-192.168.2.152-1650763442056:blk_1074938158_1198973] (DataStreamer.java:769) - blk_1074938158_1198973 sending packet seqno: 1 offsetInBlock: 64512 lastPacketInBlock: false lastByteOffsetInBlock: 129024
2023-08-26 16:50:24 DEBUG [DataStreamer for file /winner/hadoop/winipva/config/temp/siteinfo/000000 block BP-566787281-192.168.2.152-1650763442056:blk_1074938158_1198973] (DataStreamer.java:712) - stage=DATA_STREAMING, blk_1074938158_1198973
2023-08-26 16:50:24 DEBUG [DataStreamer for file /winner/hadoop/winipva/config/temp/siteinfo/000000 block BP-566787281-192.168.2.152-1650763442056:blk_1074938158_1198973] (DataStreamer.java:769) - blk_1074938158_1198973 sending packet seqno: 2 offsetInBlock: 129024 lastPacketInBlock: false lastByteOffsetInBlock: 193536
2023-08-26 16:50:24 DEBUG [DataStreamer for file /winner/hadoop/winipva/config/temp/siteinfo/000000 block BP-566787281-192.168.2.152-1650763442056:blk_1074938158_1198973] (DataStreamer.java:712) - stage=DATA_STREAMING, blk_1074938158_1198973

通过将Block切分为多个chunk,每 chunksPerPacket个chunk 组合成一个packet进行发送,并且packet的缓冲区大小采用冗余分配的方式,会为数据块内容预留空间,以防止数据块内容变化的时候重新计算校验和。

如上put代码打印的DEBUG日志:

chunkSize=516, chunksPerPacket=126, packetSize=65016 , 516 * 126 = 65016


五、心跳机制


DataNdde每间隔3 秒 向NameNode传递当前的状态信息(正常运行还是异常),NameNode每次接到信息后,就会返回要求DataNode所需要做的工作,如复制块数居到另一台机器,或删除某个数据块。如果超过10分钟30秒没有收到某个DataNode的心跳,则认为该节点不可用。

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

DataNode每隔三秒汇报给namenode

判断DataNode超时的时间公式:

timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval

而默认的heartbeat.recheck.interval 大小为5分钟,dfs.heartbeat.interval默认的大小为3秒。

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

 

参考文档:Hadoop之DataNode_麦兜仔的博客-CSDN博客

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

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

相关文章

Python爬虫框架之快速抓取互联网数据详解

概要 Python爬虫框架是一个能够帮助我们快速抓取互联网数据的工具。在互联网时代&#xff0c;信息爆炸式增长&#xff0c;人们越来越需要一种快速获取信息的方式。而Python爬虫框架就能够帮助我们完成这个任务&#xff0c;它可以帮助我们快速地从互联网上抓取各种数据&#xf…

promethues监控postgres,emqx

1、安装监控 docker pull wrouesnel/postgres_exporter2、执行 docker run -d -p 9187:9187 --name postgres_exporter --nethost -d -e DATA_SOURCE_NAME"postgresql://postgres:123456192.168.12.116:5432/rcc-manage?sslmodedisable" wrouesnel/postgres_expor…

Java读(配置)文件 根目录下、s r c 和resources目录下的区别

1. 通过File类、InputStream读文件 在普通java项目中&#xff0c;当使用java io&#xff08;Fie类、FileInputStream类等&#xff09;读文件&#xff0c;传入相对路径时&#xff1a; 这种方式读文件&#xff0c;文件路径必须是项目的根路径&#xff0c;将文件放在其他任何目录…

皕杰报表(BIOS Report)中设置序号的方法之二

在皕杰报表如何设置序号系列之一里&#xff0c;我们用ds.#0来实现了序号&#xff0c;用ds.#0得到的数据库中选取的记录的序号。有些情况下&#xff0c;记录序号在报表中不是按照顺序显示的&#xff0c;而是在报表中又通过排序或分组后的结果显示的&#xff0c;例如&#xff1a;…

陪诊小程序|陪诊软件开发功能|陪诊平台优势

随着人们生活水平的提高&#xff0c;对健康的关注度也在不断增加。尤其是在疫情过后&#xff0c;人们对自己和家人的健康问题更加重视。因此陪诊系统应运而生&#xff0c;为用户提供便捷、高效的陪诊陪护和跑腿服务。那么陪诊系统包含哪些功能呢&#xff1f; 首先&#xff0c;陪…

2023年7月京东护发市场数据分析(京东数据产品)

如今&#xff0c;与面部护肤相比&#xff0c;多数消费者认为头皮也需要认真对待&#xff0c;这在年轻消费群体中体现的较为明显。 随着消费者对护发理念的认同感不断加深&#xff0c;人们日常居家洗护的步骤也更加精细、使用产品品类也愈加多样化。除传统的护发素、发膜等护发…

Dynamic ReLU:根据输入动态确定的ReLU

这是我最近才看到的一篇论文&#xff0c;它提出了动态ReLU (Dynamic ReLU, DY-ReLU)&#xff0c;可以将全局上下文编码为超函数&#xff0c;并相应地调整分段线性激活函数。与传统的ReLU相比&#xff0c;DY-ReLU的额外计算成本可以忽略不计&#xff0c;但表示能力明显增强&…

【数据结构】 队列(Queue)与队列的模拟实现

文章目录 &#x1f340;队列(Queue)的概念&#x1f38b;队列的使用&#x1f38d;队列的模拟实现&#x1f6a9;创建队列&#x1f6a9;入队列&#x1f6a9;出队列&#x1f6a9;获取队头元素&#x1f6a9;获取队列长度&#x1f6a9;判断是否为空&#x1f6a9;完整代码 &#x1f33…

2023-08-28 小练习_环形字符串的某子串出现次数

老林的C语言新课, 想快速入门点此 <C 语言编程核心突破> 小练习_环形字符串的某子串出现次数 前言一、具体算法描述输入输出 二、代码总结 前言 最近看了一个提问, 问如何计算环形字符串的某子串出现次数, 其实算法比较简单, 增加在字符串结尾增加子字符串长度减一的字…

服务器数据恢复-reiserfs文件系统损坏如何恢复数据?

服务器数据恢复环境&#xff1a; 一台IBM X系列服务器&#xff0c;4块SAS硬盘组建一组RAID5阵列&#xff0c;采用的reiserfs文件系统。服务器操作系统分区结构&#xff1a;boot分区LVM卷swap分区&#xff08;按照前后顺序&#xff09;。LVM卷中直接划分了一个reiserfs文件系统&…

CSS基础选择器及常见属性

文章目录 一、CSS1、CSS简介2、CSS语法规范 二、CSS基础选择器1、选择器的作用2、选择器分类3、基础选择器标签选择器类选择器id选择器通配符选择器 三、CSS常见属性1、字体属性字体系列字体大小字体粗细文字样式 2、文本属性文本颜色对齐文本装饰文本文本缩进行间距 四、CSS引…

09微服务架构常见框架

一句话导读 微服务架构是一种分布式系统架构&#xff0c;可以将大型应用系统拆分为多个小型服务的一种架构方法。在微服务架构中&#xff0c;每个服务都是独立的逻辑单元&#xff0c;他们通过轻量级的通讯机制进行交互。为了更好的实现微服务架构&#xff0c;开发人员可以依赖一…

PMP P-10 Purchase Management

竟然不让上传图片了。。为啥&#xff1f;&#xff1f;&#xff1f;【上传过于频繁】行吧

搭建Serv-U FTP服务器实现外网远程访问,无需公网IP的文件共享方法

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能…

2023最新官网下载安装配置JDK8(1.8u381)的详细步骤

目录 前言 一、下载 二、安装 三、配置环境变量 四、查看 前言 JDK11版本&#xff1a;官网下载JAVA的JDK11版本&#xff08;下载、安装、配置环境变量&#xff09;_java11下载_云边的快乐猫的博客-CSDN博客JDK17版本&#xff1a; Java官网下载JDK17版本详细教程&#xff…

Compose pager分页器入门使用 HorizontalPager与VerticalPager(2023/8)

Compose pager分页器入门使用 前言依赖概念介绍参数介绍 使用基础使用规范使用跳转指定分页器 pagerState.scrollToPage()添加指示器 pagerState.currentPage 完整代码总结 前言 阅读本文需要一定compose基础&#xff0c;如果没有请移步Jetpack Compose入门详解&#xff08;实…

说说我最近招人的感受。。

大家好&#xff0c;我是鱼皮。 都说现在行情不好、找工作难&#xff0c;但招人又谈何容易&#xff1f;&#xff01; 最近我们公司在招开发&#xff0c;实习社招都有。我收到的简历很多&#xff0c;但认真投递的、符合要求的却寥寥无几&#xff0c;而且都是我自己看简历、选人…

【EI检索稳定】第六届电力电子与控制工程国际学术会议(ICPECE 2023)

第六届电力电子与控制工程国际学术会议 2023 6th International Conference on Power Electronics and Control Engineering (ICPECE 2023) 第六届电力电子与控制工程国际学术会议由广西大学主办&#xff0c;重庆大学、华东交通大学、长春理工大学、大连交通大学联合主办。电…

伦敦金走势多变怎么办

投资知识比较丰富的朋友&#xff0c;应该知道一个品种的价格过于波动&#xff0c;对投资者来说并是一件不友好的事情&#xff0c;因为频繁的价格变化&#xff0c;对于收益的稳定性会产生负面的影响&#xff0c;也可能让投资者的持仓陷入进退维谷的尴尬境地。 黄金作为贵金属市场…

【视觉系统】笔芯内径机器视觉测量软硬件方案-康耐德智能

检测内容 笔芯内径机器视觉测量系统 检测要求 精度0.03mm&#xff0c;速度120~180个/分钟 视觉可行性分析 对样品进行了光学实验&#xff0c;并进行图像处理&#xff0c;原则上可以使用机器视觉系统进行测试测量。 结果&#xff1a; 对所有样品进行分析&#xff0c;可以在不…