【Hadoop】DataNode 详解

🍁 博主 "开着拖拉机回家"带您 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.mzph.cn/news/62475.shtml

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

相关文章

【解决】idea启动spring MVC报错:一个或多个listeners启动失败Listener ClassNotFoundException

idea配置教程。tomcat调试报错Artifact :war exploded: Error during artifact deployment。 修改代码后&#xff0c;启动不生效&#xff0c;仍是旧代码。 根本原因是&#xff1a; Modules output path和Artifacts output directory不匹配 Modules output path一定要等于Ar…

网络编程 day 5

1、根据select TCP服务器流程图编写服务器 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.…

Flink SQL你用了吗?

分析&回答 Flink 1.1.0&#xff1a;第一次引入 SQL 模块&#xff0c;并且提供 TableAPI&#xff0c;当然&#xff0c;这时候的功能还非常有限。Flink 1.3.0&#xff1a;在 Streaming SQL 上支持了 Retractions&#xff0c;显著提高了 Streaming SQL 的易用性&#xff0c;使…

linuxdeploy安装CentOS7搭建django服务

目录 一、busybox安装 二、linuxdeploy安装 三、linuxdeploy软件设置及安装 四、CentOS基础环境配置 五、CentOS7 上安装Python3.8.10 六、systemctl的替代品 七、CentOS7 上安装mysql5.2.27数据库 八、CentOS7 上安装Nginx服务 九、Django项目应用部署 参考文献: 一…

《Python入门到精通》webbrowser模块详解,Python webbrowser标准库,Python浏览器控制工具

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 webbrowser模块详解 1、常用操作2、函数大全webbrowser.open() 打开浏览器webbro…

线程同步与互斥

目录 前言&#xff1a;基于多线程不安全并行抢票 一、线程互斥锁 mutex 1.1 加锁解锁处理多线程并发 1.2 如何看待锁 1.3 如何理解加锁解锁的本质 1.4 CRAII方格设计封装锁 前言&#xff1a;基于线程安全的不合理竞争资源 二、线程同步 1.1 线程同步处理抢票 1.2 如何…

Python爬虫(十七)_糗事百科案例

糗事百科实例 爬取糗事百科段子&#xff0c;假设页面的URL是: http://www.qiushibaike.com/8hr/page/1 要求&#xff1a; 使用requests获取页面信息&#xff0c;用XPath/re做数据提取获取每个帖子里的用户头像连接、用户姓名、段子内容、点赞次数和评论次数保存到json文件内…

实现不同局域网文件共享的解决方案:使用Python自带HTTP服务和端口映射

文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用&#xff0c;不仅在商业和办公场景有广泛的应用…

2023.8.26-2023.9.3 周报【3D+GAN+Diffusion基础知识+训练测试】

目录 学习目标 学习内容 学习时间 学习产出 学习目标 1. 3D方向的基础知识 2. 图像生成的基础知识&#xff08;GAN \ Diffusion&#xff09; 3. 训练测试GAN和Diffusion 学习内容 1. 斯坦福cv课程-3D &#xff08;网课含PPT&#xff09; 2. sjtu生成模型课件 3. ge…

TCP--半连接队列和全连接队列

原文地址&#xff1a;https://plantegg.github.io/2020/04/07/%E5%B0%B1%E6%98%AF%E8%A6%81%E4%BD%A0%E6%87%82TCP–%E5%8D%8A%E8%BF%9E%E6%8E%A5%E9%98%9F%E5%88%97%E5%92%8C%E5%85%A8%E8%BF%9E%E6%8E%A5%E9%98%9F%E5%88%97–%E9%98%BF%E9%87%8C%E6%8A%80%E6%9C%AF%E5%85%AC%E…

【OpenCL基础 · 一】因源

文章目录 前言一、单核标量处理器的瓶颈1.提升时钟频率2.提升指令级并行能力 二、多核和向量化1.多核2.向量化 三、异构并行和OpenCL1.GPGPU2.CUDA和OpenCL 前言 随着人工智能的发展以及大部分场景中实时性的要求&#xff0c;人们对于计算机算力要求逐渐增加。为了提高计算速度…

【ES】笔记-Promise基本使用

笔记-基本使用 一、初始Promise1. 抽象表达:2. 具体表达:为什么要用 Promise?promise的基本流程 二、fs读取文件三、AJAX请求四、Promise封装fs模块五、util.promisify方法六、Promise封装AJAX操作 一、初始Promise 1. 抽象表达: 1. Promise 是一门新的技术(ES6 规范) 2. Pr…

短视频矩阵系统接口部署技术搭建

前言 短视频矩阵系统开发涉及到多个领域的技术&#xff0c;包括视频编解码技术、大数据处理技术、音视频传输技术、电子商务及支付技术等。因此&#xff0c;短视频矩阵系统开发人员需要具备扎实的计算机基础知识、出色的编程能力、熟练掌握多种开发工具和框架&#xff0c;并掌握…

C++(17):异常处理

异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理。 异常使得能够将问题的检测与解决过程分离开来&#xff1a;程序的一部分负责检测问题的出现&#xff0c;然后解决该问题的任务传递给程序的另一部分。检测环节无须知道问题处理模块的…

数据结构入门 — 栈

本文属于数据结构专栏文章&#xff0c;适合数据结构入门者学习&#xff0c;涵盖数据结构基础的知识和内容体系&#xff0c;文章在介绍数据结构时会配合上动图演示&#xff0c;方便初学者在学习数据结构时理解和学习&#xff0c;了解数据结构系列专栏点击下方链接。 博客主页&am…

【C++】关于using namepace xxx 使用命名空间和冲突

官方定义 namespace是指 标识符的各种可见范围。命名空间用关键字namespace来定义。 命名空间是C的一种机制&#xff0c;用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。 基本使用 编译及执行命令&#xff1a; g test.cpp -o test ./…

汽车制造行业,配电柜如何实施监控?

工业领域的生产过程依赖于高效、稳定的电力供应&#xff0c;而配电柜作为电力分配和控制的关键组件&#xff0c;其监控显得尤为重要。 配电柜监控通过实时监测、数据收集和远程控制&#xff0c;为工业企业提供了一种有效管理电能的手段&#xff0c;从而确保生产的连续性、安全性…

Python程序化交易接口批量获取数据源码

小编举例下面是一个简单的示例代码&#xff0c;展示如何使用Python的程序化交易接口批量获取数据&#xff0c;例如开发文档参考&#xff1a;MetaTradeAPI (metatradeapi) - Gitee.com 签名 int Init(); 功能 API 初始化 参数 无 返回值 授权成功的交易账户数量 返回值 &…

实战系列(一)| Dubbo和Spring Cloud的区别,包含代码详解

目录 1. 概述2. 核心功能3. 代码示例4. 适用场景 Dubbo 和 Spring Cloud 都是微服务架构中的重要框架&#xff0c;但它们的定位和关注点不同。Dubbo 是阿里巴巴开源的一个高性能、轻量级的 RPC 框架&#xff0c;主要用于构建微服务之间的服务治理。而 Spring Cloud 是基于 Spri…

学术加油站|基于端到端性能的学习型基数估计器综合测评

编者按 本文系东北大学李俊虎所著&#xff0c;也是「 OceanBase 学术加油站」系列第 11 篇内容。 「李俊虎&#xff1a;东北大学计算机科学与工程学院在读硕士生&#xff0c;课题方向为数据库查询优化&#xff0c;致力于应用 AI 技术改进传统基数估计器&#xff0c;令数据库选…