一、原理剖析
1.1 小文件不是"自然长成"的,是写出来的
很多团队把小文件当成一个玄学问题,出了问题就怪"HDFS 不行"“Spark 不行”。我当年也这么想过,直到我们把一张表的写入链路从头到尾埋点统计了一遍,才发现小文件的数量是可以精确算出来的,而且误差在 5% 以内。
核心公式其实很简单:
单批次落地文件数 ≈ 写入任务的最终并行 task 数 × 目标分区数这个公式我后面会反复用到。它告诉我们一件事:只要你能控制"task 数"和"分区数"两个变量,你就能预测文件数。反过来,小文件失控,一定是这两个变量里至少有一个失控了。下面我把三个最常见的失控来源一个一个拆开,每个都给实测。
1.1.1 任务并行度:被忽略的第一个乘数
我们最初定位问题,是从一个最不起眼的 Spark 作业开始的。这个作业读一张 40G 的维表,做一点清洗后原样写回 ODS。配置是这样的:
spark.sql.shuffle.partitions:200spark.sql.files.maxPartitionBytes