文章目录
- 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工作机制
- 一个数据块在 Datanode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
- DataNode 启动后向 Namenode 注册,通过后,周期性(1小时)的向 Namenode 上报所有的块信息
- 心跳是每 3 秒一次,心跳返回结果带有 Namenode 给该 DataNode 的命令如复制块数据到另一台机器,或删除某个数据块。如果超过 10 分钟没有收到某个 DataNode 的心跳,则认为该节点不可用
- 集群运行中可以安全加入和退出一些机器
5.2 数据完整性
- 当 DataNode 读取 block 的时候,它会计算 checksum
- 如果计算后的 checksum,与 block 创建时值不一样,说明 block 已经损坏
- client 读取其他 DataNode 上的 block.
- 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 版本号具体解释
- storageID:存储id号
- clusterID:集群id,全局唯一
- cTime:标记了 Datanode 存储系统的创建时间,对于刚刚格式化的存储系统,这个属性为0;但是在文件系统升级之后,该值会更新到新的时间戳
- datanodeUuid:Datanode 的唯一识别码
- storageType:存储类型
- 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 数据块版本号的具体解释
- namespaceID:是 Datanode 首次访问 Namenode 的时候从 Namenode 处获取的 storageID; 对每个 Datanode 来说是唯一的(但对于单个 Datanode 中所有存储目录来说则是相同的),Namenode 可用这个属性来区分不同 Datanode
- cTime:标记了 Datanode 存储系统的创建时间,对于刚刚格式化的存储系统,这个属性为0;但是在文件系统升级之后,该值会更新到新的时间戳
- blockpoolID:一个 block pool id 标识一个block pool,并且是跨集群的全局唯一;当一个新的 Namespace 被创建的时候(format过程的一部分)会创建并持久化一个唯一ID;在创建过程构建全局唯一的 lockPoolID 比人为的配置更可靠一些。Namenode 将 BlockPoolID 持久化到磁盘中,在后续的启动过程中,会再次 load 并使用
- layoutVersion:一个负整数,通常只有 HDFS 增加新特性时才会更新这个版本号
5.5 服役新数据节点
5.5.1 需求
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点
5.5.2 环境准备
- 克隆一台虚拟机(master -> slave3),并启动
从 master 上克隆可节省文件同步的时间,否则需要重新安装、配置 JDK、Hadoop - 修改 ip 地址为 192.168.27.104
- 修改 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
- 修改主机名
hostnamectl set-hostname slave3
- 建立 master、slave1、slave2 和 slave3 之间的免密
删除 slave3 下的 .ssh,重新生成公钥进行同步
以上五步可参考 Hadoop集群搭建-3
- 删除原来 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 服役新节点具体步骤
- 在 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
- 在 Namenode 的 hdfs-site.xml 配置文件中增加 dfs.hosts 属性
<property>
<name>dfs.hosts</name>
<value>/usr/hadoop/hadoop-2.9.2/etc/hadoop/dfs.hosts</value>
</property>
- 刷新 Namenode
[root@master hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful
新增了 master、slave3 的 Datanode 节点
- 更新 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
- 在 Namenode 的 slaves 文件中增加新主机名称
增加 master、slave3 不需要分发
master
slave1
slave2
slave3
- 单独命令启动新的数据节点和节点管理器
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 进程已启动
- 在 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
- 在 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
- 在 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>
- 刷新 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
- 检查 web 浏览器,退役节点的状态 无(退役中),说明数据节点正在复制块到其他节点
- 等待退役节点状态为 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
- 从 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
- 从 Namenode 的 slave 文件中删除退役节点 hadoop105
master
slave1
slave2
slave3
- 如果数据不均衡,可以用命令实现集群的再平衡
[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>