1、背景:

这是 DataNode 运行状况检查,用于检查 DataNode 是否含有过多的块。如果 DataNode 含有过多的块,可能影响 DataNode 的性能。具有大量块数的 DataNode 将需要较大的 java 堆并且可能遇到较长时间的垃圾回收暂停。另外,大量块数可能表明存在许多小文件。不会为处理许多小文件而优化 HDFS,跨许多小文件进行操作时处理时间可能受影响。
如果只有部分 DataNode 有大量块,运行 HDFS 重新平衡命令可以通过移动 DataNode 之间的数据解决该问题。如果 HDFS 重新平衡命令将群集报告为平衡,没有修复块不平衡,则问题与存在的许多小文件有关。参阅 HDFS 文档了解解决该问题的最佳做法。如果许多小文件不是您的使用案例的关注点,则考虑禁用该运行状况测试。如果所有 DataNode 都有大量块数且该问题与小文件无关,则应添加更多 DataNode。
这个报警本身是对系统的反映,它只起到监控的作用,但是还是可以继续运行存储数据。如果这个报警觉得对系统没有危害,那么可以忽略。

2、查找HDFS有哪些小文件以及统计数量

  1. hdfs 导出fsimage文件

    1. hdfs dfsadmin -fetchImage /data
  2. 转换为可视化数据

    1. hdfs oiv -i /data/fsimage_0000000000930647029 -o /data/fsimage.csv -p Delimited -delimiter ","
  3. 删除数据第一行标题

    1. sed -i 1d /data/fsimage.csv
  4. 把数据导入mysql

    1. CREATE TABLE IF NOT EXISTS `images_info` (
    2. `Path` VARCHAR ( 100 ),
    3. `Replication` INT ( 20 ),
    4. `ModificationTime` VARCHAR ( 100 ),
    5. `AccessTime` VARCHAR ( 100 ),
    6. `PreferredBlockSize` BIGINT ( 100 ),
    7. `BlocksCount` INT ( 20 ),
    8. `FileSize` BIGINT ( 100 ),
    9. `NSQUOTA` VARCHAR ( 100 ),
    10. `DSQUOTA` VARCHAR ( 100 ),
    11. `Permission` VARCHAR ( 100 ),
    12. `UserName` VARCHAR ( 100 ),
    13. `GroupName` VARCHAR ( 100 )
    14. ) CHARSET=utf8;
  5. 加载数据到mysql

    1. load data local infile '/data/fsimage.csv' into table imgaes_info;
  6. 查找小文件

    1. select count(Path), count(FileSize) from images_info where FileSize < 500;