HDFS 合并碎文件

我们都知道,在HDFS中不宜存储大量的小文件。所谓小文件,就是大小远小于dfs.block.size的文件。如果有大量小文件的话,会浪费block,使元数据增加,挤占宝贵的NameNode内存。另外,大文件能够发挥磁盘顺序读写的优势,小文件会产生很多随机读写,性能下降。

前几天编写了Spark Streaming程序作为consumer,处理数据并下沉到以天分区的Hive外部表中,批次间隔(batch duration)为10秒钟。久而久之,产生了很多小文件。直觉上讲可以通过增长batch duration来减少输出,但这肯定是下下策。

如何合并碎文件

方式一:通过命令 Usage: hadoop fs [generic options] -getmerge [-nl] [-skip-empty-file]

将hdfs小文件合并到本地,然后删除hdfs原文件,再将本地文件上传到hdfs

# 合并小文件至本地
hadoop fs -getmerge -skip-empty-file /hdfspath/* /localpath/test.txt

# 删除hdfs源文件
hdfs dfs -rm /hdfspath/*

# 将合并后的文件上传至hdfs
hdfs dfs -put /localpath/test.txt /hdfspath/