在 Spark 中,小文件过多(Small Files Problem)是一个非常经典且严重的性能杀手。它主要会导致两个问题: 1. 元数据压力:HDFS 的 Namenode 内存压力大(每个文件占用约 150 bytes 内存)。 2. 计算效率低:Spark 会为每个文件(或 block)生成一个 Task,导致 Task 启动/销毁的开销远大于实际计算时间,且会有大量的磁盘 IO 和网络通信。 解决这个问题通常需要分三个阶段来考虑:读取时(输入)、计算中(处理)、写入时(输出),以及事后治理。 以下是详细的解决方案: --- 1. 读取阶段 (Input) 当数据源已经是大量小文件时,我们需要让 Spark 在读取时将它们合并,避免生成成千上万个 Task。 调整 (推荐) 原理:这是 Spark SQL 读取文件时的核心参数。默认是 128MB。Spark 会尝试将多个小文件打包进一个分区(Partition),直到达到这个大小。 操作:如果小文件特别多且特别小,可以适当调小这个值(例如 64MB),或者保持默认,确保 Spark 能够自动合并。 配合参数:(默认 4M...