本文为您介绍如何开启SparkSQL的小文件合并功能,并提供支持的SQL语句示例。通过该功能,您可以有效减少写入操作生成的小文件数量,从而提升查询性能。
功能概述
在大数据场景中,小文件问题常常会导致存储和计算效率低下。为了解决这一问题,SparkSQL提供了小文件合并功能,可以在写入操作(如 INSERT
、CREATE 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;
全局开启
进入集群服务页面。
在顶部菜单栏处,根据实际情况选择地域和资源组。
在EMR on ECS页面,单击目标集群操作列的集群服务。
新增配置项。
在集群服务页面,单击Spark3服务区域的配置。
单击spark-thriftserver.conf页签。
单击新增配置项。
输入Key为
spark.sql.adaptive.merge.output.small.files.enabled
,Value为true
的配置项。您还可以新增参数
spark.sql.adaptive.advisoryOutputFileSizeInBytes
,调整写表之前插入的Shuffle的分区大小,默认值为256 MB。该参数会影响最终文件的大小。单击确定。
在弹出的对话框中,输入执行原因,单击保存。
重启SparkThriftServer。
在集群服务页面,单击状态页签。
在组件列表区域,单击SparkThriftServer操作列的重启。
在弹出的对话框中,输入执行原因,单击确定。
在确认对话框中,单击确定。
支持的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