问题描述
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/FAQ#On_an_individual_data_node.2C_how_do_you_balance_the_blocks_on_the_disk.3F
总结
是什么原因造成了数据落盘时的不均匀情况?本主要文调研了Hadoop的数据两种写入磁盘的策略:循环选取策略和可用空间策略。
循环选取策略
循环选取的策略很简单,循环扫描整个Volumes,如果availableVolumeSize大于blockSize ,即返回该volume。按照循环的策略,数据会均匀的落在不同大小的盘上,大磁盘和小磁盘存储的块是一样的,导致小的磁盘最先被写满。

当Hadoop DataNode节点的磁盘大小不一致时,可能导致磁盘使用不均,小磁盘空间耗尽,影响集群正常运行。解决方案包括数据清理、压缩或手动移盘。可用空间策略和循环选取策略决定了数据如何落盘。可通过调整Hadoop配置文件,如设置`dfs.datanode.fsdataset.volume.choosing.policy`,来改善磁盘利用率。
最低0.47元/天 解锁文章
7354

被折叠的 条评论
为什么被折叠?



