我们都知道,在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/
评论区