SparkSQL合并小文件功能使用说明

本文为您介绍如何开启SparkSQL的小文件合并功能,并提供支持的SQL语句示例。通过该功能,您可以有效减少写入操作生成的小文件数量,从而提升查询性能。

功能概述

在大数据场景中,小文件问题常常会导致存储和计算效率低下。为了解决这一问题,SparkSQL提供了小文件合并功能,可以在写入操作(如 INSERTCREATE TABLE 等)时自动合并生成的输出文件。但该功能仅对当前写入操作生成的文件生效,不会对历史数据进行合并。

  • 作用范围:仅对当前写入操作生成的文件生效,不会对历史数据进行合并。

  • 支持场景:

    • 非分区表

    • 静态分区写入

    • 动态分区写入

  • 版本支持:

    • 非分区表及静态分区写入:EMR-5.5.0及之后版本,EMR-3.39.0及之后版本的Spark3。

    • 动态分区写入:EMR-5.10.0及之后版本,EMR-3.44.0及之后版本的Spark3。

开启小文件合并功能

重要

Spark作业中处理小文件输出时,小文件合并是一种常见的性能优化手段。由于合并操作会引入额外的计算和I/O开销,不建议全局启用该功能,但可针对特定任务按需开启。

按需开启(推荐)

  • 任务级配置

    在提交Spark作业时,通过--conf参数显式启用小文件合并功能,仅对当前任务生效。

    --conf spark.sql.adaptive.merge.output.small.files.enabled=true
  • SQL级配置

    SQL脚本中通过SET命令临时启用小文件合并功能,仅对当前Session或后续SQL语句生效。

    SET spark.sql.adaptive.merge.output.small.files.enabled=true;

全局开启

  1. 进入集群服务页面。

    1. 登录E-MapReduce控制台

    2. 在顶部菜单栏处,根据实际情况选择地域和资源组

    3. EMR on ECS页面,单击目标集群操作列的集群服务

  2. 新增配置项。

    1. 集群服务页面,单击Spark3服务区域的配置

    2. 单击spark-thriftserver.conf页签。

    3. 单击新增配置项

    4. 输入Keyspark.sql.adaptive.merge.output.small.files.enabledValuetrue的配置项。

      您还可以新增参数spark.sql.adaptive.advisoryOutputFileSizeInBytes,调整写表之前插入的Shuffle的分区大小,默认值为256 MB。该参数会影响最终文件的大小。

    5. 单击确定

    6. 在弹出的对话框中,输入执行原因,单击保存

  3. 重启SparkThriftServer。

    1. 集群服务页面,单击状态页签。

    2. 组件列表区域,单击SparkThriftServer操作列的重启

    3. 在弹出的对话框中,输入执行原因,单击确定

    4. 确认对话框中,单击确定

支持的SQL

支持以下类型的SQL语句,示例如下所示:

  • CREATE TABLE table_a AS SELECT * FROM table_b

  • INSERT INTO table_a SELECT * FROM table_b

  • INSERT INTO table_c PARTITION (dt) SELECT * FROM table_d

  • INSERT INTO table_c PARTITION (dt=20250626 ) SELECT * FROM table_d

  • INSERT OVERWRITE TABLE table_c PARTITION (dt) SELECT * FROM table_d

  • INSERT OVERWRITE TABLE table_c PARTITION (dt=20250626) SELECT * FROM table_d