作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
中间件,我给它的定义就是为了实现某系业务功能依赖的软件,包括如下部分:
Web服务器
代理服务器
ZooKeeper
Kafka
RabbitMQ
Hadoop HDFS(本章节)
前面我们介绍了HDFS的安装,在单机版本里面一共启动了3个java进程:
NameNode,DataNode,SecondaryNameNode,下面我们就来分别介绍这3个进程,今天是DataNode****。****
DataNode 是 Hadoop 分布式文件系统(HDFS)中负责实际数据存储与读写的核心组件,与 NameNode 形成 “主从架构”——NameNode 掌管元数据与决策,DataNode 则承担具体的数据块存储、传输及状态汇报工作。其设计聚焦于高吞吐量、容错性与分布式协作,以下从核心功能、工作机制、数据管理及优化策略展开详解。
一、核心功能
数据块的存储与管理:DataNode 是 HDFS 中数据的 “物理载体”,所有用户数据最终以****数据块(Block) 形式存储在 DataNode 的本地文件系统(如 Linux 的 ext4、XFS)中。每个数据块默认大小为 128MB(可配置),一个大文件会被拆分为多个块(最后一块可能小于默认大小),并根据 NameNode 指令存储在不同 DataNode 上(默认 3 个副本)。
-
数据块在本地以文件形式保存,文件名由块 ID 与副本索引组成(如
blk_1073741825_1001.meta),同时伴随一个元文件(.meta),记录块的校验和(用于数据完整性校验)。 -
DataNode 需确保存储的块与 NameNode 记录的元数据一致,定期通过 “块报告” 向 NameNode 同步本地块列表。
**客户端数据读写执行:**DataNode 直接与客户端交互完成数据传输,是 HDFS 高吞吐量的关键执行者:
-
读操作:客户端从 NameNode 获取目标块的存储地址后,直接与对应 DataNode 建立连接,通过 TCP 协议读取块数据(支持并行读取多个块以加速大文件读取);
-
写操作:客户端根据 NameNode 分配的块存储节点列表,将数据块按 “流水线模式” 写入第一个 DataNode,该节点接收数据后立即向第二个节点转发,依次传递直至所有副本写入完成,最后由最后一个节点向客户端返回确认。
集群状态汇报与协作
-
心跳机制:每 3 秒向 NameNode 发送一次心跳信息,包含自身存活状态、磁盘使用率、负载等数据。若 NameNode 超过 10 分钟未收到心跳,会判定该 DataNode 失效并触发副本修复;
-
块报告:每小时(或 NameNode 主动请求时)向 NameNode 发送一次 “块报告”,列出本地存储的所有数据块信息,供 NameNode 校验副本完整性并更新元数据。
二、数据块的生命周期管理
DataNode 对数据块的管理贯穿 “创建 - 存储 - 复制 - 删除” 全生命周期,且完全受 NameNode 调度:
-
块创建:客户端写入数据时,DataNode 接收数据并写入本地临时文件,待整个块写入完成且校验和无误后,重命名为正式块文件(避免不完整块被误读),同时更新块列表;
-
块复制:当 NameNode 检测到某块副本数不足(如 DataNode 失效),会向存有该块的 DataNode 发送 “复制指令”,DataNode 读取本地块并传输到目标节点,直至副本数达标;
-
块删除:当文件被删除或副本数调整时,NameNode 向冗余块所在的 DataNode 发送 “删除指令”,DataNode 立即删除对应块文件及元文件,并在下次块报告中同步状态;
-
块校验:DataNode 定期对本地块进行校验和计算(与元文件中的校验和比对),若发现数据损坏(如磁盘错误导致块内容变更),立即向 NameNode 报告,触发块修复。
三、工作机制的关键细节
流水线写入机制:为提升大文件写入效率,HDFS 采用 “流水线复制” 策略:客户端将数据块写入第一个 DataNode 时,该节点接收一部分数据(如 64KB 缓冲区满)后,立即向第二个 DataNode 转发,同时继续接收客户端后续数据。这种 “边接收边转发” 的模式避免了数据在单节点完整存储后再复制的延迟,将写入时间从 “串行复制” 的 n*T 缩短为接近 T(n 为副本数,T 为单块传输时间)。
机架感知与数据本地化:DataNode 会向 NameNode 汇报自身所属的机架信息(通过配置文件指定机架路径,如 /rack1/node1),NameNode 据此优化块存储策略:优先将块存储在客户端所在机架的 DataNode(“数据本地化”),减少跨机架网络传输;副本分配时确保至少有一个副本在不同机架,避免单机架故障导致数据丢失。DataNode 无需参与机架决策,仅需准确上报自身位置信息。
磁盘负载均衡:DataNode 通常配置多块磁盘以提升存储容量与吞吐量,其内部会通过 “轮询策略” 将新块均匀分配到不同磁盘,避免单盘过载。同时,会定期检查各磁盘的使用率,若某磁盘使用率过高(如超过阈值 90%),会向 NameNode 上报,由 NameNode 调度将部分块迁移到同节点的其他磁盘。
运维小路
一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!
关注微信公众号《运维小路》获取更多内容。