1、背景:
这是 DataNode 运行状况检查,用于检查 DataNode 是否含有过多的块。如果 DataNode 含有过多的块,可能影响 DataNode 的性能。具有大量块数的 DataNode 将需要较大的 java 堆并且可能遇到较长时间的垃圾回收暂停。另外,大量块数可能表明存在许多小文件。不会为处理许多小文件而优化 HDFS,跨许多小文件进行操作时处理时间可能受影响。
如果只有部分 DataNode 有大量块,运行 HDFS 重新平衡命令可以通过移动 DataNode 之间的数据解决该问题。如果 HDFS 重新平衡命令将群集报告为平衡,没有修复块不平衡,则问题与存在的许多小文件有关。参阅 HDFS 文档了解解决该问题的最佳做法。如果许多小文件不是您的使用案例的关注点,则考虑禁用该运行状况测试。如果所有 DataNode 都有大量块数且该问题与小文件无关,则应添加更多 DataNode。
这个报警本身是对系统的反映,它只起到监控的作用,但是还是可以继续运行存储数据。如果这个报警觉得对系统没有危害,那么可以忽略。
2、查找HDFS有哪些小文件以及统计数量
hdfs 导出fsimage文件
hdfs dfsadmin -fetchImage /data
转换为可视化数据
hdfs oiv -i /data/fsimage_0000000000930647029 -o /data/fsimage.csv -p Delimited -delimiter ","
删除数据第一行标题
sed -i 1d /data/fsimage.csv
把数据导入mysql
CREATE TABLE IF NOT EXISTS `images_info` (
`Path` VARCHAR ( 100 ),
`Replication` INT ( 20 ),
`ModificationTime` VARCHAR ( 100 ),
`AccessTime` VARCHAR ( 100 ),
`PreferredBlockSize` BIGINT ( 100 ),
`BlocksCount` INT ( 20 ),
`FileSize` BIGINT ( 100 ),
`NSQUOTA` VARCHAR ( 100 ),
`DSQUOTA` VARCHAR ( 100 ),
`Permission` VARCHAR ( 100 ),
`UserName` VARCHAR ( 100 ),
`GroupName` VARCHAR ( 100 )
) CHARSET=utf8;
加载数据到mysql
load data local infile '/data/fsimage.csv' into table imgaes_info;
查找小文件
select count(Path), count(FileSize) from images_info where FileSize < 500;