6.1.DataNode工作机制
- 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,数据块的校验和,以及时间戳。
- DataNode启动后向NameNode注册,注册成功后,周期性的向NameNode上报所有的块信息。
- 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令,例如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
- 集群运行中可以安全加入和退出一些机器。
6.2.数据完整性
- 当DataNode读取block的时候,它会计算checksum。
- 如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
- client读取其他DataNode上的block。
- DataNode在文件创建后周期性验证checksum。
6.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
配置文件中dfs.namenode.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>
6.4.增加新数据节点
需求:随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新数据节点。
环境准备
- 克隆一台虚拟机(NameNode)
- 修改ip地址和主机名称
- 增加新增节点的ssh免密码登录配置
- 删除新节点上data和logs目录中的文件(因为克隆的NameNode主机)
操作步骤
- 在namenode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件
touch dfs.hosts
vi dfs.hosts
添加如下主机名称(所有DataNode节点,包含新增的节点hadoop105)
hadoop102
hadoop103
hadoop104
hadoop105
注意:其中dfs.hosts列出了连入NameNode的节点,如果为空,则所有的DataNode都可以连入NameNode。如果不为空,则文件中存在的DataNode可以连入。
dfs.hosts.exclude
列出了禁止连入NameNode的节点。如果一个节点同时存在于dfs.hosts和dfs.hosts.exclude,则禁止连入。
- 在namenode的hdfs-site.xml配置文件中增加dfs.hosts属性
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
</property>
- 刷新namenode
hdfs dfsadmin -refreshNodes
结果如下所示
Refresh nodes successful
- 刷新resourcemanager节点
yarn rmadmin -refreshNodes
结果如下所示
INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
- 在NameNode和DataNode的slaves文件中增加新主机名称
hadoop102
hadoop103
hadoop104
hadoop105
- 在新的节点上启动数据节点和节点管理器
sbin/hadoop-daemon.sh start datanode
结果如下所示
starting datanode, logging to /opt/module/hadoop-2.7.2/logs/hadoop-lubin-datanode-hadoop105.out
sbin/yarn-daemon.sh start nodemanager
结果如下所示
starting nodemanager, logging to /opt/module/hadoop-2.7.2/logs/yarn-lubin-nodemanager-hadoop105.out
-
在web浏览器上检查是否ok
-
如果数据不均衡,可以用命令实现集群的再平衡(在sbin目录下执行如下命令)
./start-balancer.sh
如下所示
starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-lubin-balancer-hadoop102.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
6.5.退役旧数据节点
(1) 在namenode $HADOOP_HOME/etc/hadoop
目录下创建dfs.hosts.exclude
文件
touch dfs.hosts.exclude
添加退役节点主机名
hadoop105
(2) 在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>
(3) 在namenode所在节点刷新namenode、在resourcemanager所在节点刷新resourcemanager
$ hdfs dfsadmin -refreshNodes
出现如下所示信息,表示刷新成功
Refresh nodes successful
$ yarn rmadmin -refreshNodes
出现如下所示信息,表示刷新成功
INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
(4) 检查web浏览器,退役节点的状态为decommission in progress(退役中),说明数据节点正在复制块到其他节点。
(5) 等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役。
(6) 在退役节点上,停止该节点进程
sbin/hadoop-daemon.sh stop datanode
stopping datanode
sbin/yarn-daemon.sh stop nodemanager
stopping nodemanager
(7) 从namenode的dfs.hosts文件中删除退役节点hadoop105
hadoop102
hadoop103
hadoop104
刷新namenode,刷新resourcemanager
$ hdfs dfsadmin -refreshNodes
Refresh nodes successful
$ yarn rmadmin -refreshNodes
INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
(8) 从NameNode和DataNode的slave文件中删除退役节点hadoop105
hadoop102
hadoop103
hadoop104
(9) 如果数据不均衡,可以用命令实现集群的再平衡
$ sbin/start-balancer.sh
starting balancer, logging to /opt/module/hadoop-2.7.2/logs/hadoop-lubin-balancer-hadoop102.out
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
6.6.Datanode多目录配置
- datanode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本。
- 修改配置文件
hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///hd2/dfs/data2</value>
</property>
注意:默认值为file:///${hadoop.tmp.dir}/dfs/data
,若服务器有多个磁盘必须对这个参数进行修改(注意挂载磁盘的访问权限问题);
每台服务器节点磁盘情况不一样,所以修改该配置后,不需要分发;
6.7.数据均衡
6.7.1.Hadoop节点间数据均衡
(1) 开启数据均衡
sbin/start-balancer.sh -threshold 10
参数:10表示集群中各节点磁盘空间利用率相差不超过10%,可根据实际情况进行调整
(2) 停止数据均衡
sbin/stop-balancer.sh
注意:由于HDFS需要启动单独的Rebalance Server来执行Rebalance操作,所以尽量不要在NameNode上执行start-balancer.sh。
(2) Hadoop2.X 支持节点间数据均衡
hdfs balancer -help
Usage: java Balancer
[-policy <policy>] the balancing policy: datanode or blockpool
[-threshold <threshold>] Percentage of disk capacity
[-exclude [-f <hosts-file> | comma-sperated list of hosts]] Excludes the specified datanodes.
[-include [-f <hosts-file> | comma-sperated list of hosts]] Includes only the specified datanodes.
为了更高效率的执行balancer操作,建议如下:
-
-threshold 10 参数含义:判断集群是否平衡的目标参数,每一个 datanode 存储使用率和集群总存储使用率的差值都应该小于这个阀值,理论上,该参数设置的越小,整个集群就越平衡,但是在线上环境中,hadoop集群在进行balance时,还在并发的进行数据的写入和删除,所以有可能无法到达设定的平衡参数值。
-
-include 参数含义:要进行均衡的datanode列表
-
-exclude 参数含义:不想进行均衡的datanode列表
hdfs dfsadmin -setBalancerBandwidth xxx 参数含义:设置balance工具在运行中所能占用的带宽,设置的过大可能会造成mapred运行缓慢。
CDH Balancer的用法很简单,只需要设定好上述参数,再点击Actions→Rebalance菜单项,就会自动开始平衡了。如果之前有运行,需要先中止掉,如果起不来,需要kill 掉
6.7.2.磁盘间数据均衡
(1) 开启disk balancer
在CDH 5.8.2+版本中,可以通过在CM中配置。如果使用的Hadoop版本是3.0+(hadoop2.X不支持磁盘间数据均衡),就直接在hdfs-site.xml中加入相关项。设置dfs.disk.balancer.enabled
为true
(2) 生成均衡计划
hdfs diskbalancer -plan cdh4
注意:cdh4为需要均衡的主机
(3) 执行均衡计划
hdfs diskbalancer -execute {/system/diskbalancer/XXXXX/{主机名}.plan.json}
(4) 查看执行状态hdfs diskbalancer -query {主机名}
(5)结束及检查
hadoop2.x不能自动对磁盘进行均衡,在节点的hdfs-site.xml中添加了几个参数用来改变数据存储策略已达到均衡的目的,添加完参数后重启这个节点的datanode即可。
<property>
<name>dfs.datanode.fsdataset.volume.choosing.policy</name>
<value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
</property>
<property>
<name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold</name>
<value>10737418240</value>
</property>
<property>
<name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction</name>
<value>0.85f</value>
</property>
参数解释
dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold
剩余容量最大的磁盘与最小的磁盘的容量之差(10G默认值)
dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction
如果当前副本的大小大于lowAvailableVolumes里面所有的磁盘最大的可用空间,那么会存放到highAvailableVolumes里面,除此之外的情况会以85%的概率存放到highAvailableVolumes,15%的概率存放到lowAvailableVolumes。
注意:
这个对于已经存储到磁盘上面的数据是无效的,只针对后续存储的数据有效,对于已经存储的数据使用均衡进行数据转移。