本文主要是介绍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 版权声明:本文为博主原创文章,转载请附上博文链接! |
|
这篇关于Hadoop的磁盘大小不一导致节点挂掉的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!