
# 配置矢量化读取ORC数据
#### 操作场景
ORC文件格式是一种Hadoop生态中的列式存储格式，它最初产生自Apache Hive，用于降低Hadoop数据存储空间和加速Hive查询速度。和Parquet文件格式类似，ORC并不是一个单纯的列式存储格式，仍然是首先根据行组分割整个表，在每一个行组内按列进行存储，并且文件中的数据尽可能地压缩来降低存储空间的消耗。
在Spark 2.3及之后版本中，SparkSQL支持矢量化读取ORC数据（这个特性在Hive的历史版本中已经得到支持），能够获得比传统读取方式数倍的性能提升。
在MRS集群中，Spark默认开启了矢量化方式读取ORC格式的数据功能，以获得最佳性能。用户可以选择通过Hive或者SparkSQL本身对ORC格式数据进行读写。
- hive：使用Hive内置的ORC处理库，可以很好地兼容旧版Hive生成的ORC文件。
- native：使用SparkSQL自身原生的ORC处理库，性能更优，维护更简单。
用户可以通过集群管理界面修改Spark相关配置，调整矢量化方式读取ORC格式的配置。
#### 约束与限制
使用SparkSQL内置的矢量化方式读取ORC数据需要满足所有的数据类型均为AtomicType类型，所谓AtomicType表示非NULL、UDTs、arrays、maps类型。如果列中存在这几种类型的任意一种数据，都将无法获得预期的性能。
#### 配置参数
1. 登录FusionInsight Manager系统。 
   详细操作请参考[访问集群Manager](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2124.html)。
   
   
2. 选择"集群 \> 服务 \> Spark2x/Spark \> 配置"，单击"全部配置"，搜索并调整以下参数。 
   表1矢量化读取ORC数据配置 
   | **参数**                               | **参数说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 取值示例 |
   |:---|:---|:---|
   | spark.sql.orc.enableVectorizedReader | 配置是否开启矢量化方式读取ORC格式的数据功能。 - true：默认值，开启矢量化方式读取ORC格式的数据功能。  - false：关闭矢量化方式读取ORC格式的数据功能。 当ORC文件包含深度嵌套的结构体、数组或复杂映射时，矢量化读取器可能无法高效处理。或者在极端数据倾斜场景下，向量化读取器可能导致单个任务内存占用过高，引发OOM（Out of Memory Error）异常，此时可尝试关闭。    | true |
   | spark.sql.codegen.wholeStage         | 配置是否启用任务全阶段代码生成优化，该功能通过将多个操作（如过滤、映射、聚合）融合为单一Java函数以显著提升Spark查询执行效率。 - true：默认值，通常建议开启。  - false：不启用全阶段代码生成优化功能。 对于简单的扫描或过滤操作，代码生成的编译开销可能超过执行收益，此时可尝试关闭。                                                      | true |
   | spark.sql.codegen.maxFields          | 控制全阶段代码生成过程中允许处理的最大字段数量。当表或数据集中的字段数量超过该阈值时，Spark会自动禁用代码生成优化，转而使用传统的迭代器执行模式。 系统默认值为100，在处理宽表或复杂嵌套结构时，可能需要根据实际情况调整。建议通过监控执行计划和日志，找到阈值的最优值，避免因字段数超限导致代码生成失效或性能下降。 使用SparkSQL内置的矢量化方式读取ORC数据时，本参数值需不小于schema的列数。                                                                                                                                                                                    | 100  |
   | spark.sql.orc.impl                   | 指定读取ORC数据的SQL执行引擎。 - hive：默认值，使用Hive内置的ORC处理库，可以很好的兼容旧版Hive生成的ORC文件。当Spark需要处理由Hive生成的复杂ORC文件（如使用特殊编码或分区格式）时，此模式更可靠。  - native：使用Spark内置的ORC解析器，该引擎经过优化，性能较高，支持向量化读取，且与Spark生态深度集成。                                                             | hive |
      
   
   
3. 修改参数配置后，单击"保存"，根据界面提示操作后，等待配置保存成功。
4. Spark服务端配置更新后，如果"配置状态"为"配置过期"，则需重启组件以使配置生效。 
   图1修改Spark配置   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002339002425.png "点击放大")
   在Spark服务概览页面，选择"更多 \> 重启服务/滚动重启服务"，验证管理员密码后，等待服务重启成功。
   如果使用Spark客户端提交任务，修改了集群的"spark.sql.orc.enableVectorizedReader"、"spark.sql.codegen.wholeStage"、"spark.sql.codegen.maxFields"和"spark.sql.orc.impl"参数后，需要重新下载客户端才能使配置生效，请参考[使用MRS客户端](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2126.html)。
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/warning_3.0-zh-cn.png)
   组件重启期间将无法对外提供服务，可能会影响集群的上层业务正常运行，请在业务空闲期或确认操作无影响后再执行本操作。
   
   
 
