DateNode工作机制
- 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
- DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
- 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
- 集群运行中可以安全加入和退出一些机器。
数据完整性
为了保证数据的完整性,一般采用数据校验技术:
- 奇偶校验技术
- md5,sha1等校验技术
- CRC-32循环冗余校验技术
- ECC内存纠错校验技术
HDFS数据完整性
- HDFS以透明方式校验所有写入的数据,可以通过io.bytes.per.checksum属性设置,字节数默认是512 字节,创建一个单独的校验和,如果节点检测数据错误,就会报CheckSumException异常。
- 除了在读取数据时进行验证,数据节点也会在后台运行一个线程
DataBlockscanner(数据块检测程序)周期性的验证存储在数据节点上的所有块。 - 一旦检测到corruptblock,在heartbeat阶段,DN会收到NN发来的Block Command,从其他数据块中拷贝一份新的replica(备份块)。
掉线时限参数设置
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 配置文件中的dfs.namenode.heartbeat.recheck-interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
在hdfs-default.xml描述如下
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
<description>
This time decides the interval to check for expired datanodes.
With this value and dfs.heartbeat.interval, the interval of
deciding the datanode is stale or not is also calculated.
The unit of this configuration is millisecond.
</description>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
<description>Determines datanode heartbeat interval in seconds.</description>
</property>
添加新数据节点
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
环境准备
- 克隆一台虚拟机
- 修改ip地址和主机名称
- 修改xsync文件,增加新增节点的ssh无密登录配置
- 删除原来HDFS文件系统留存的文件(/opt/module/hadoop-2.8.3/data)
如果只有一个集群,那么单独启动datanode就可以,如果有多个集群,需要做如下配置
配置
- 在namenode的/opt/module/hadoop-2.8.3/etc/hadoop目录下创建dfs.hosts文件白名单名字可以随便写,只要绝对路径指向正确既可以
输入如下内容
hadoop-100
hadoop-101
hadoop-102
hadoop-103
- 在namenode的hdfs-site.xml配置文件中增加dfs.hosts属性
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-2.8.3/etc/hadoop/dfs.hosts</value>
</property>
- 刷新namenode
hdfs dfsadmin -refreshNodes - 更新resourcemanager节点
yarn rmadmin -refreshNodes - 在NameNode的slaves文件中增加新主机名称
hadoop-100
hadoop-101
hadoop-102
hadoop-103 - 单独命令启动新的数据节点和节点管理器
hadoop-daemon.sh start namenode
yarn-daemon.sh start nodemanager - 在web浏览器上检查是否ok
数据不均匀
start-balancer.sh
可以用命令实现集群的再平衡
退役旧数据节点
- 在namenode的/opt/module/hadoop-2.8.3/etc/hadoop目录下创建dfs.hosts.exclude文件
输入要退役的节点的主机名称
如,本例要退役hadoop-103 - 在namenode的hdfs-site.xml配置文件中增加dfs.hosts.exclude属性
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-2.3.3/etc/hadoop/dfs.hosts.exclude</value>
</property>
- 刷新namenode、刷新resourcemanager
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes -
检查web浏览器,退役节点的状态为decommission in progress(退役中),说明数据节点正在复制块到其他节点
-
等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役
- 从dfs.hosts文件中删除退役节点,再运行刷新节点的命令
- 从namenode的slave文件中删除退役节点hadoop-103
- 从dfs.hosts.exclude删除hadoop-103
- 如果数据不均衡,可以用命令实现集群的再平衡
start-balancer.sh
可以用命令实现集群的再平衡
DateNode多目录配置
- 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>
注意,不用格式化namenode,在哪台节点上配置,哪台节点DataNode是多目录