Hadoop的磁盘大小不一导致节点挂掉

问题描述
DataNode挂载的磁盘或者DataNode节点挂载多个磁盘,如果存在一些磁盘大小不一样,数据在落盘时就可能会出现磁盘使用率不均匀的情况,容量较小的盘容易被写满,而容量大的盘还剩很多空间。磁盘写满后,影响Hadoop集群的正常工作。

建好集群后需要将历史记录导入到hbase中,而集群中有三台主机外接了磁盘阵列,主机磁盘阵列大小四十多G,磁盘阵列大概1.6个T。运行将数据写入hbase的程序,第二天发现集群挂掉了两个节点。用df查看各个磁盘使用情况,发现主机系统盘使用率100%!!!外接磁盘阵列使用率才3%。由于主机系统盘几乎没有剩余磁盘空间,导致操作系统也不能正常使用:tab键补全命令不能使用,vim打开文件报错等等。

解决方案
于是先解决燃眉之急,网上提供的解决办法有三种:

数据清理:此方法属于紧急措施:清理掉hdfs中不用的数据 
数据压缩:手动压缩部分数据,对于HBase可使用GZ压缩方式,能快速有效的降低磁盘使用率 
数据移盘:手动进行数据的移动,将部分数据由写满的盘移动到其它盘
我选择了第三种解决办法,主要有三步操作:

关闭DataNode节点 
使用mv命令移动数据,要绝对保证移动后的数据相对目录与移动前一致,如移动前usr/local/hadoop/tmp/dfs/data/current/BP-22769690-172.16.0.100-1541402558553/current/finalized/subdir0/subdir0,移动后为home/dfs/data/current/BP-22769690-172.16.0.100-1541402558553/current/finalized/subdir0/subdir0(注意:路径格式应该保持严格一致;而且subdir0目录下一共有32个subdir文件,从subdir0到subdir31,我选择是将其都移出去)
重启DataNode;sbin/hadoop-daemon.sh start datanode;sbin/yarn-daemon.sh start nodemanager
可以参考 https://wiki.apache.org/hadoop/F ... ocks_on_the_disk.3F 

总结
是什么原因造成了数据落盘时的不均匀情况?本主要文调研了Hadoop的数据两种写入磁盘的策略:循环选取策略和可用空间策略。

循环选取策略
循环选取的策略很简单,循环扫描整个Volumes,如果availableVolumeSize大于blockSize ,即返回该volume。按照循环的策略,数据会均匀的落在不同大小的盘上,大磁盘和小磁盘存储的块是一样的,导致小的磁盘最先被写满。所以就导致了本次节点挂掉。

可用空间策略
通过计算不同磁盘最大剩余空间与最小剩余空间的差值,然后与阈值dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold进行对比,默认为10G,如果小于该值,将使用循环写入策略,如果不小于该值,则使用最大可用空间策略。这样磁盘的使用率就会相对均匀。

查看是否有损坏节点
hdfs fsck /

改进:修改挂载多个磁盘主机的hadoop的配置文件hdfs-site.xml
property>

            <name>dfs.datanode.fsdataset.volume.choosing.policy</name>
            <value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
             <description>
                  datanode数据副本存放的磁盘选择策略,有2种方式一种是轮询方式(org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy,为默认方式),
                  另一种为选择可用空间足够多的磁盘存储方式,这个为了防止各个节点上的各个磁盘的存储均匀采用这个方式。
            </description>
</property>
<property>
            <name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold</name>
           <value>10737418240</value>
            <description>
                   当在上面datanode数据副本存放的磁盘选择可用空间足够多的磁盘存储方式开启时,此选项才生效。这个参数主要功能是:
                   首先计算出两个值,算出一个节点上所有磁盘中具有最大可用空间,另外一个值是所有磁盘中最小可用空间,如果这
                   两个值相差小于该配置项指定的阀值时,则就用轮询方式的磁盘选择策略选择磁盘存储数据副本,如果比这个阀值大的话则
                   还是选择可用空间足够多的磁盘存储方式。此项默认值为10737418240即10G
                  </description>
</property>
<property>
                  <name>dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction</name>
                  <value>0.75f</value>
                  <description>
                   默认值是0.75f,一般使用默认值就行。具体解析:有多少比例的数据副本应该存储到剩余空间足够多的磁盘上。
                   该配置项取值范围是0.0-1.0,一般取0.5-1.0,如果配置太小,会导致剩余空间足够的磁盘实际上没分配足够的数据副本,
                   而剩余空间不足的磁盘取需要存储更多的数据副本,导致磁盘数据存储不均衡。
                  </description>
</property>

<property>
                  <name>dfs.datanode.dfs.reserved</name>
                  <value>10737418240</value>
                  <description>
                   Reserved space in bytes per volume. Always leave this much space free for non dfs use.
                  </description>
</property>
--------------------- 
作者:山木枝 
来源:CSDN 
原文:https://blog.csdn.net/intersting/article/details/84200773 
版权声明:本文为博主原创文章,转载请附上博文链接!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值