小文件优化
操作场景
Spark SQL表中,经常会存在很多小文件(大小远小于HDFS的块大小),每个小文件默认对应Spark中的一个Partition,即一个Task。在有很多小文件时,Spark会启动很多Task,此时当SQL逻辑中存在Shuffle操作时,会大大增加hash分桶数,严重影响系统性能。
针对小文件很多的场景,DataSource在创建RDD时,先将Table中的split生成PartitionedFile,再将这些PartitionedFile进行合并。即将多个PartitionedFile组成一个partition,从而减少partition数量,避免在Shuffle操作时生成过多的hash分桶,如图1所示。
操作步骤
要启动小文件优化,在Spark客户端的“spark-defaults.conf”配置文件中进行设置。
参数 | 描述 | 默认值 |
|---|---|---|
spark.sql.files.maxPartitionBytes | 在读取文件时,将单个分区打包的最大字节数。 单位:byte。 | 134217728(即128M) |
spark.files.openCostInBytes | 打开文件的预估成本, 按照同一时间能够扫描的字节数来测量。当一个分区写入多个文件时使用。高估更好,这样小文件分区将比大文件分区更先被调度。 | 4M |


