第6章 DataNode

6.1.DataNode工作机制

在这里插入图片描述

  1. 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,数据块的校验和,以及时间戳。
  2. DataNode启动后向NameNode注册,注册成功后,周期性的向NameNode上报所有的块信息。
  3. 心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令,例如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
  4. 集群运行中可以安全加入和退出一些机器。

6.2.数据完整性

  1. 当DataNode读取block的时候,它会计算checksum。
  2. 如果计算后的checksum,与block创建时值不一样,说明block已经损坏。
  3. client读取其他DataNode上的block。
  4. 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.增加新数据节点

需求:随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新数据节点。

环境准备

  1. 克隆一台虚拟机(NameNode)
  2. 修改ip地址和主机名称
  3. 增加新增节点的ssh免密码登录配置
  4. 删除新节点上data和logs目录中的文件(因为克隆的NameNode主机)

操作步骤

  1. 在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,则禁止连入。

  1. 在namenode的hdfs-site.xml配置文件中增加dfs.hosts属性
<property>
	<name>dfs.hosts</name>
	<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
</property>
  1. 刷新namenode
hdfs dfsadmin -refreshNodes

结果如下所示

Refresh nodes successful
  1. 刷新resourcemanager节点
yarn rmadmin -refreshNodes

结果如下所示

INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033
  1. 在NameNode和DataNode的slaves文件中增加新主机名称
hadoop102
hadoop103
hadoop104
hadoop105
  1. 在新的节点上启动数据节点和节点管理器
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
  1. 在web浏览器上检查是否ok

  2. 如果数据不均衡,可以用命令实现集群的再平衡(在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。
注意
这个对于已经存储到磁盘上面的数据是无效的,只针对后续存储的数据有效,对于已经存储的数据使用均衡进行数据转移。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值