5. DataNode 工作机制
5.1 DataNode工作机制
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:一个blockpoolid标识一个blockpool,并且是跨集群的全局唯一;当一个新的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
4、 修改主机名;
hostnamectl set-hostname slave3
5、 建立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
2、 在Namenode的hdfs-site.xml配置文件中增加dfs.hosts属性;
<property>
<name>dfs.hosts</name>
<value>/usr/hadoop/hadoop-2.9.2/etc/hadoop/dfs.hosts</value>
</property>
3、 刷新Namenode;
[root@master hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful
新增了 master、slave3 的 Datanode 节点 4、 更新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
5、 在Namenode的slaves文件中增加新主机名称;
增加 master、slave3 不需要分发
master
slave1
slave2
slave3
6、 单独命令启动新的数据节点和节点管理器;
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 进程已启动 7、 在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
2、 在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>
3、 刷新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
4、 检查web浏览器,退役节点的状态无(退役中),说明数据节点正在复制块到其他节点;
5、 等待退役节点状态为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
6、 从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
7、 从Namenode的slave文件中删除退役节点hadoop105;
master
slave1
slave2
slave3
8、 如果数据不均衡,可以用命令实现集群的再平衡;
[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>