Spark SQL小文件是指文件大小显著小于hdfs block块大小的的文件。过于繁多的小文件会给HDFS带来很严重的性能瓶颈,对任务的稳定和集群的维护会带来极大的挑战。
一般来说,通过Hive调度的MR任务都可以简单设置如下几个小文件合并的参数来解决任务产生的小文件问题:
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=xxxx;
set hive.merge.smallfiles.avgsize=xxx;
然而在我们将离线调度任务逐步从Hive迁移到Spark的过程中,由于Spark本身并不支持小文件合并功能,小文件问题日益突出,对集群稳定性造成很大影响,一度阻碍了我们的迁移工作。
为了解决小文件问题,我们经历了从开始的不断调整参数到后期的代码开发等不同阶段,这里给大家做一个简单的分享。
1. Spark为什么会产生小文件
Spark生成的文件数量直接取决于RDD里partition的数量和表分区数量。注意这里的两个分区概念并不相同,RDD的分区与任务并行度相关,而表分区则是Hive的分区数目。生成的文件数目一般是RDD分区数和表分区的乘积。因此,当任务并行度过高或者分区数目很大时,很容易产生很多的小文件。