
# 配置Spark读取ORC和Parquet文件的Task数量
#### 配置场景
Spark ORC和Parquet文件读取时，支持指定splitBytes大小和压缩率来控制读取文件阶段的Task数量，开启特性后读取ORC和Parquet文件的Task数量不随可用Executor数量的增加而一直增加，从而减少无效Task数量，降低Driver Task调度压力，提升Driver高负载场景下的整体性能。
#### 使用约束
- 本章节仅适用于MRS 3.6.0-LTS.1及之后版本。

- 支持表的类型为：DataSource表、ORC Hive表（spark.sql.hive.convertMetastoreOrc=true时生效）、Parquet Hive表（spark.sql.hive.convertMetastoreParquet=true时生效）
- 支持的数据格式：Parquet、ORC
 
#### 配置参数
在Spark客户端的"*{客户端安装目录}*/Spark/spark/conf/spark-defaults.conf"配置文件中进行设置，修改如下参数：
| 参数名称                                                  | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 默认值   |
|:---|:---|:---|
| spark.sql.orc.resourceFriendly.split.mode.enabled     | 用于控制Spark在读取ORC文件时是否启用splitBytes大小和压缩率来控制读取文件阶段的Task数量。 - true：在资源充足情况下，支持按照spark.sql.preset.orc.stripe.size大小切分ORC文件后进行读取。  - false：不启用splitBytes大小和压缩率来控制读取文件阶段的Task数量。                | false |
| spark.sql.preset.orc.stripe.size                      | Spark在读取ORC文件时，推荐设置的orc.stripe.size值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 64MB  |
| spark.sql.orc.fileCompressionFactor                   | ORC文件中压缩后的stripe大小/orc.stripe.size的值 ，数据不同，ORC文件中压缩后的stripe大小会不同。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | 1.0   |
| spark.sql.parquet.resourceFriendly.split.mode.enabled | 用于控制Spark在读取parquet文件时是否启用splitBytes大小和压缩率来控制读取文件阶段的Task数量。 - true：在资源充足情况下，支持按照spark.sql.preset.parquet.block.size大小切分Parquet文件后进行读取。  - false：不启用splitBytes大小和压缩率来控制读取文件阶段的Task数量。   | false |
| spark.sql.preset.parquet.block.size                   | Spark在读取parquet文件时，推荐设置的parquet.block.size值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | 128MB |
| spark.sql.parquet.fileCompressionFactor               | parquet文件中压缩后的Row Group大小/parquet.block.size的值 ，数据不同，parquet文件中压缩后的Row Group大小会不同。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 1.0   |
   
#### 读取文件时的SplitBytes计算逻辑
- 在可用资源不足的情况下，会优先按照可用资源计算的SplitBytes进行读取文件切分。
- spark.sql.orc.resourceFriendly.split.mode.enabled=true时，ORC文件读取时的SplitBytes计算逻辑：
  ```
  orcStripSize = spark.sql.preset.orc.stripe.size * spark.sql.orc.fileCompressionFactor
  ```
  最终使用的SplitBytes = Math.max(基于可用资源计算的SplitBytes, orcStripSize)
  

- spark.sql.parquet.resourceFriendly.split.mode.enabled=true时，Parquet文件读取时的SplitBytes计算逻辑：
  ```
  parquetBlockSize = spark.sql.preset.parquet.block.size * spark.sql.parquet.fileCompressionFactor
  ```
  最终使用的SplitBytes = Math.max（基于可用资源计算的SplitBytes, parquetBlockSize）
  
 
