文章目录

  • 5. DataNode 工作机制
  • 5.1 DataNode工作机制
  • 5.2 数据完整性
  • 5.3 掉线时限参数设置
  • 5.4 DataNode 的目录结构
  • 5.4.1 查看 DataNode 的版本号
  • 5.4.2 DataNode 版本号具体解释
  • 5.4.3 DataNode 数据块版本号
  • 5.4.4 DataNode 数据块版本号的具体解释
  • 5.5 服役新数据节点
  • 5.5.1 需求
  • 5.5.2 环境准备
  • 5.5.3 服役新节点具体步骤
  • 5.5.4 集群再平衡
  • 5.6 退役旧数据节点
  • 5.7 Datanode 多目录配置


5. DataNode 工作机制

5.1 DataNode工作机制

Hadoop的工作流程示例图怎么画_hadoop

  1. 一个数据块在 Datanode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
  2. DataNode 启动后向 Namenode 注册,通过后,周期性(1小时)的向 Namenode 上报所有的块信息
  3. 心跳是每 3 秒一次,心跳返回结果带有 Namenode 给该 DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳,则认为该节点不可用
  4. 集群运行中可以安全加入和退出一些机器

5.2 数据完整性

  1. 当 DataNode 读取 block 的时候,它会计算 checksum
  2. 如果计算后的 checksum,与 block 创建时值不一样,说明 block 已经损坏
  3. client 读取其他 DataNode 上的 block.
  4. DataNode 在其文件创建后周期验证 checksum

5.3 掉线时限参数设置

Datanode 进程死亡或者网络故障造成 Datanode 无法与 Namenode 通信,Namenode 不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长

HDFS 默认的超时时长为 10分钟 + 30秒

如果定义超时时间为timeout,则超时时长的计算公式为:

timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。

而默认的 dfs.namenode.heartbeat.recheck-interval 大小为5分钟,dfs.heartbeat.interval默认为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>

5.4 DataNode 的目录结构

和 Namenode 不同的是,Datanode 的存储目录是初始阶段自动创建的,不需要额外格式化

5.4.1 查看 DataNode 的版本号

在 /usr/local/hadoop/tmp/dfs/data/current 这个目录下查看版本号

[root@slave1 current]# cat VERSION 
#Fri Mar 06 16:58:36 CST 2020
storageID=DS-7908c807-e3ec-4b85-952a-922ba8d3a24f
clusterID=CID-f383d6c4-da30-47c7-beb6-02c589c47f27
cTime=0
datanodeUuid=f230ca32-5797-4949-b996-95bf66a25a0d
storageType=DATA_NODE
layoutVersion=-57

5.4.2 DataNode 版本号具体解释

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

5.4.3 DataNode 数据块版本号

在 /usr/local/hadoop/tmp/dfs/data/current/BP-116957957-192.168.27.101-1582684942545/current 这个目录下查看该数据块的版本号

[root@slave1 current]# pwd
/usr/local/hadoop/tmp/dfs/data/current/BP-116957957-192.168.27.101-1582684942545/current
[root@slave1 current]# cat VERSION 
#Fri Mar 06 16:58:36 CST 2020
namespaceID=866472014
cTime=1582684942545
blockpoolID=BP-116957957-192.168.27.101-1582684942545
layoutVersion=-57

5.4.4 DataNode 数据块版本号的具体解释

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

5.5 服役新数据节点

5.5.1 需求

随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点

5.5.2 环境准备

  1. 克隆一台虚拟机(master -> slave3),并启动
    从 master 上克隆可节省文件同步的时间,否则需要重新安装、配置 JDK、Hadoop
  2. 修改 ip 地址为 192.168.27.104
  3. 修改 ip 映射(/etc/hosts),并在 master、slave1、slave2 上同步修改
    在 master、slave1、slave2 基础上新增 192.168.27.104 slave3
192.168.27.101 master
192.168.27.102 slave1
192.168.27.103 slave2
192.168.27.104 slave3
  1. 修改主机名
hostnamectl set-hostname slave3
  1. 建立 master、slave1、slave2 和 slave3 之间的免密
    删除 slave3 下的 .ssh,重新生成公钥进行同步

以上五步可参考 Hadoop集群搭建-3

  1. 删除原来 HDFS 文件系统留存的文件
    从 master 上拷贝过来的 Hadoop 信息,清除 logs 和 data
rm -rf /usr/hadoop/hadoop-2.9.2/logs /usr/local/hadoop/tmp/dfs/data

因为 msater 上没跑 Datanode,所以 data 的目录可以不加

所有准备工作完备

5.5.3 服役新节点具体步骤

  1. 在 Namenode 的 ~/etc/hadoop 目录下创建 dfs.hosts 文件
[root@master .ssh]# cd /usr/hadoop/hadoop-2.9.2/etc/hadoop/
[root@master hadoop]# vim dfs.hosts

添加如下主机名称(包含新服役的节点)

master
slave1
slave2
slave3
  1. 在 Namenode 的 hdfs-site.xml 配置文件中增加 dfs.hosts 属性
<property>
    <name>dfs.hosts</name>
    <value>/usr/hadoop/hadoop-2.9.2/etc/hadoop/dfs.hosts</value>
</property>
  1. 刷新 Namenode
[root@master hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful

Hadoop的工作流程示例图怎么画_hadoop_02

新增了 master、slave3 的 Datanode 节点

  1. 更新 resourcemanager 节点
[root@master hadoop]# yarn rmadmin -refreshNodes
20/03/06 15:07:16 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.27.101:8033
  1. 在 Namenode 的 slaves 文件中增加新主机名称
    增加 master、slave3 不需要分发
master
slave1
slave2
slave3
  1. 单独命令启动新的数据节点和节点管理器
    master、slave3 上都启动 Datanode 和 NodeManager
[root@slave3 hadoop-2.9.2]# hadoop-daemon.sh start datanode
starting datanode, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-datanode-slave3.out
[root@slave3 hadoop-2.9.2]# yarn-daemon.sh start nodemanager
starting nodemanager, logging to /usr/hadoop/hadoop-2.9.2/logs/yarn-root-nodemanager-slave3.out

[root@slave3 hadoop-2.9.2]# jps
3154 DataNode
3266 NodeManager
3423 Jps

确认 DataNode 和 NodeManager 进程已启动

  1. 在 web 浏览器上检查是否 ok

目前只启动了 slave3 节点上的 Datanode 和 NodeManager

5.5.4 集群再平衡

如果数据不均衡,可以用命令实现集群的再平衡

[root@slave1 .ssh]# start-balancer.sh
starting balancer, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-balancer-slave1.out
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved

重新配置 192.168.27.105 slave4,作为后续旧数据节点的退役

5.6 退役旧数据节点

此例退役上面刚服役的节点: 192.168.27.105 slave4

  1. 在 Namenode 的 ~/etc/hadoop 目录下创建 dfs.hosts.exclude 文件
[root@master hadoop]# pwd
/usr/hadoop/hadoop-2.9.2/etc/hadoop
[root@master hadoop]# vim dfs.hosts.exclude

添加如下主机名称(要退役的节点)

slave4
  1. 在 Namenode 的 hdfs-site.xml 配置文件中增加 dfs.hosts.exclude 属性
<property>
    <name>dfs.hosts.exclude</name>
    <value>/usr/hadoop/hadoop-2.9.2/etc/hadoop/dfs.hosts.exclude</value>
</property>
  1. 刷新 Namenode、刷新 Resourcemanager
[root@master hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful
[root@master hadoop]# yarn rmadmin -refreshNodes
20/03/06 15:58:31 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.27.101:8033
  1. 检查 web 浏览器,退役节点的状态 无(退役中),说明数据节点正在复制块到其他节点
  2. 等待退役节点状态为 decommissioned(所有块已经复制完成),停止该节点及节点资源管理器

此时,slave4 上的 DataNode 和 NodeManager 进程仍在

[root@slave4 hadoop]#  jps
5232 NodeManager
5563 Jps
5116 DataNode

注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役

停止该节点及节点资源管理器

[root@slave4 hadoop]# hadoop-daemon.sh stop datanode
stopping datanode
[root@slave4 hadoop]# yarn-daemon.sh stop nodemanager
stopping nodemanager
  1. 从 include 文件中删除退役节点,再运行刷新节点的命令
    (1) 从 Namenode 的 dfs.hosts 文件中删除退役节点 slave4
master
 slave1
 slave2
 slave3

(2) 刷新 Namenode,刷新 Resourcemanager

[root@master hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful
[root@master hadoop]# yarn rmadmin -refreshNodes
20/03/06 17:11:21 INFO client.RMProxy: Connecting to ResourceManager at master/192.168.27.101:8033
  1. 从 Namenode 的 slave 文件中删除退役节点 hadoop105
master
slave1
slave2
slave3
  1. 如果数据不均衡,可以用命令实现集群的再平衡
[root@master hadoop]# start-balancer.sh 
starting balancer, logging to /usr/hadoop/hadoop-2.9.2/logs/hadoop-root-balancer-master.out
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved

5.7 Datanode 多目录配置

Datanode 也可以配置成多个目录,每个目录存储的数据不一样,即数据不是副本

具体配置如下:

[hdfs-site.xml]

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>