
# 配置Spark自适应数据重分布小文件合并
#### 操作场景
自适应"数据重分布"小文件合并特性开启后，Spark在写入数据前，判断是否需要增加Shuffle合并。如果需要增加Shuffle合并，Spark会启动一个ShuffleJob，并将合并后的数据写入到表目录下。
#### 约束与限制
- 本章节仅适用于MRS 3.6.0-LTS及之后版本。
- 开启自适应执行特性（设置spark.sql.adaptive.enabled为true）。
- 写入表的类型为：Hive、Datasource
- 支持的数据格式：parquet、orc
- 如果SQL的Insert前有以下算子，则不会再添加Shuffle合并： Limit、Sort、Repartition、RepartitionByExpression、RebalancePartitions
  
 
#### 配置参数
1. 安装Spark客户端。 
   详细操作请参考[安装MRS客户端](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2127.html)。
   
   
2. 使用客户端安装用户登录Spark客户端节点。 
   在Spark客户端的"*{客户端安装目录}* /Spark/spark/conf/spark-defaults.conf"配置文件中进行设置，修改如下参数：
   
   | **参数**                                                                    | **参数说明**                                                                                                                                                                                                                                                                                                                                | 取值示例  |
   |:---|:---|:---|
   | spark.sql.optimizer.mergeSmallFilesUsingShuffle.enabled                   | 是否启用使用Shuffle来合并小文件的功能，以减少文件数量，提高读取和处理性能。 - false：默认值，即默认不启用此功能。  - true：Spark在写入目标表前会判断是否需要增加Shuffle合并，如果需要合并，会启动一个ShuffleJob。   | true  |
   | spark.sql.optimizer.mergeSmallFiles.addshuffle.enabled                    | 在不包含Limit、Sort、RepartitionByExpression、Repartition、RebalancePartitions的前提下，开启时直接增加Shuffle，关闭时根据SQL的情况判断是否增加Shuffle。                                                                                                                                                                                                                     | 16MB  |
   | spark.sql.adaptive.rebalance.advisoryPartitionSizeInBytes                 | 自适应优化时，控制增加的shuffle的分区建议大小，在Spark聚合小shuffle分区或拆分倾斜的shuffle分区时生效。                                                                                                                                                                                                                                                                        | 256MB |
   | spark.sql.optimizer.mergeSmallFiles.inferRebalanceAndSortOrders.enabled   | 否启用通过推断重新平衡和排序顺序来合并小文件的功能。 - false：默认值，即默认不启用此功能。  - true：开启后，Spark会在执行计划中推断并应用重新平衡和排序顺序来合并小文件，以减少文件数量，提高读取和处理性能。            | true  |
   | spark.sql.optimizer.mergeSmallFiles.inferRebalanceAndSortOrdersMaxColumns | 指定在推断重新平衡和排序顺序来合并小文件时，列推断使用的最大列数。                                                                                                                                                                                                                                                                                                       | 3     |
      
   
   
 
