
# 小文件优化
#### 操作场景
Spark SQL表中，经常会存在很多小文件（大小远小于HDFS的块大小），每个小文件默认对应Spark中的一个Partition，即一个Task。在有很多小文件时，Spark会启动很多Task，此时当SQL逻辑中存在Shuffle操作时，会大大增加hash分桶数，严重影响系统性能。
针对小文件很多的场景，DataSource在创建RDD时，先将Table中的split生成PartitionedFile，再将这些PartitionedFile进行合并。即将多个PartitionedFile组成一个partition，从而减少partition数量，避免在Shuffle操作时生成过多的hash分桶，如[图1]所示。
图1小文件合并   
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001724867661.jpg "点击放大")
#### 操作步骤
1. 安装Spark客户端。 
   详细操作请参考[安装MRS客户端](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2127.html)。
   
   
2. 使用客户端安装用户登录Spark客户端节点。 
   在Spark客户端的"*{客户端安装目录}*/Spark/spark/conf/spark-defaults.conf"配置文件中进行设置。
   表1参数介绍 
   | **参数**                            | **描述**                                                                          | 取值示例             |
   |:---|:---|:---|
   | spark.sql.files.maxPartitionBytes | 在读取文件时，将单个分区打包的最大字节数。 单位：byte。 | 134217728（即128M） |
   | spark.files.openCostInBytes       | 打开文件的预估成本， 按照同一时间能够扫描的字节数来测量。当一个分区写入多个文件时使用。高估更好，这样小文件分区将比大文件分区更先被调度。           | 4M               |
      
   
   
 
