更新时间:2025-06-10 GMT+08:00

优化小文件场景下的Spark SQL性能

操作场景

Spark SQL的表中,经常会存在很多小文件(大小远小于HDFS块大小),每个小文件默认对应Spark中的一个Partition,也就是一个Task。在很多小文件场景下,Spark会起很多Task。当SQL逻辑中存在Shuffle操作时,会大大增加hash分桶数,严重影响性能。

在小文件场景下,您可以通过如下配置手动指定每个Task的数据量(Split Size),确保不会产生过多的Task,提高性能。

配置描述

  1. 安装Spark客户端。

    详细操作请参考安装MRS客户端

  2. 使用客户端安装用户登录Spark客户端节点。

    要启动小文件优化,在Spark客户端的“{客户端安装目录}/Spark/spark/conf/spark-defaults.conf”配置文件中进行设置。

    当SQL逻辑中不包含Shuffle操作时,设置此配置项,不会有明显的性能提升。

    表1 参数说明

    参数

    描述

    取值示例

    spark.sql.files.maxPartitionBytes

    在读取文件时,将单个分区打包的最大字节数。

    单位:byte。

    134217728(即128M)

    spark.files.openCostInBytes

    打开文件的预估成本, 按照同一时间能够扫描的字节数来测量。当一个分区写入多个文件时使用。高估更好,这样小文件分区将比大文件分区更先被调度。

    4M