hadoop 中目录,文件和块都会以对象的形式保存在 namenode 的内存中, 大概每个对象会占用 150bytes. 小文件数量多会大量占用 namenode 的内存; 使 namenode 读取元数据速度变慢, 启动时间延长; 还因为占用内存过大, 导致 gc 时间增加等.
解决办法:
两个角度,
一是从根源解决小文件的产生,
二是解决不了就选择合并. 从数据来源入手, 如每小时抽取一次改为每天抽取一次等方法来积累数据量。
如果小文件无可避免, 一般就采用合并的方式解决. 可以写一个 MR 任务读取某个目录下的所有小文件, 并重写为一个大文件。
具体方法:
1.当每个小文件数据量比较小的时候,可以通过命令的方式进行小文件的合并如:
hdfs dfs -cat hdfs://mycluster/logs/*.log | hdfs dfs -appendToFile - hdfs://mycluster/logs/largeFile.log,
2.当数据量比较大的时候建议使用 MR 进行小文件的合并.
欢迎来撩 : 汇总all