文章目录
一、DataNode工作机制
- 一个数据块在
DataNode
上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳 DataNode
启动后向NameNode
注册,通过后,周期性(1小时)的向NameNode
上报所有的块信息- 心跳是每3秒一次,心跳返回结果带有
NameNode
给该DataNode
的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode
的心跳,则认为该节点不可用 - 集群运行中可以安全加入和退出一些机器
二、数据完整性
DataNode
节点保证数据完整性的方法:
- 当
DataNode
读取Block
的时候,它会计算CheckSum
- 如果计算后的
CheckSum
,与Block
创建时值不一样,说明Block
已经损坏 Client
读取其他DataNode
上的Block
DataNode
在其文件创建后周期验证CheckSum
三、掉线时限参数设置
如果定义超时时间为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>
四、服役新数据节点
-
需求
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
-
在原有的节点上克隆一台主机
-
修改IP地址和主机名称
-
删除原来的HDFS文件系统留存的文件(
data
和log
文件) -
使配置文件生效
source /etc/profile
-
启动DataNode
sbin/hadoop-daemon.sh start datanode sbin/yarn-daemon.sh start nodemanager
-
如果数据不均衡,可以用命令实现集群的再平衡
sbin/start-balancer.sh
五、退役旧数据节点
(一)设置退役白名单
-
添加到白名单的主机节点,都允许访问
NameNode
,不在白名单的主机节点,都会被退出 -
在
NameNode
的etc/hadoop
目录下创建dfs.hosts
文件,并添加相应主机名称或地址 -
在
NameNode
的hdfs-site.xml
配置文件中增加dfs.hosts
属性<property> <name>dfs.hosts</name> <value>文件路径/dfs.hosts</value> </property>
-
将以上配置分发给所有主机
(二)设置退役黑名单
-
在黑名单上面的主机都会被强制退出
-
在
NameNode
的etc/hadoop
目录下创建dfs.hosts.exclude
文件,并添加相应主机名称或地址 -
在
NameNode
的hdfs-site.xml
配置文件中增加dfs.hosts.exclude
属性<property> <name>dfs.hosts.exclude</name> <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude</value> </property>
-
将以上配置分发给所有主机
-
刷新
NameNode
、刷新ResourceManager
hdfs dfsadmin -refreshNodes yarn rmadmin -refreshNodes
-
注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役
六、DataNode多目录配置(同NameNode配置)
-
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>