配置矢量化读取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类型。如果列中存在这几种类型的任意一种数据,都将无法获得预期的性能。
配置参数
- 登录FusionInsight Manager系统。
详细操作请参考访问集群Manager。
- 选择“集群 > 服务 > Spark2x/Spark > 配置”,单击“全部配置”,搜索并调整以下参数。
表1 矢量化读取ORC数据配置 参数
参数说明
取值示例
spark.sql.orc.enableVectorizedReader
配置是否开启矢量化方式读取ORC格式的数据功能。
true
spark.sql.codegen.wholeStage
配置是否启用任务全阶段代码生成优化,该功能通过将多个操作(如过滤、映射、聚合)融合为单一Java函数以显著提升Spark查询执行效率。
true
spark.sql.codegen.maxFields
控制全阶段代码生成过程中允许处理的最大字段数量。当表或数据集中的字段数量超过该阈值时,Spark会自动禁用代码生成优化,转而使用传统的迭代器执行模式。
系统默认值为100,在处理宽表或复杂嵌套结构时,可能需要根据实际情况调整。建议通过监控执行计划和日志,找到阈值的最优值,避免因字段数超限导致代码生成失效或性能下降。
使用SparkSQL内置的矢量化方式读取ORC数据时,本参数值需不小于scheme的列数。
100
spark.sql.orc.impl
指定读取ORC数据的SQL执行引擎。
- hive:默认值,使用Hive内置的ORC处理库,可以很好的兼容旧版Hive生成的ORC文件。当Spark需要处理由Hive生成的复杂ORC文件(如使用特殊编码或分区格式)时,此模式更可靠。
- native:使用Spark内置的ORC解析器,该引擎经过优化,性能较高,支持向量化读取,且与Spark生态深度集成。
hive
- 修改参数配置后,单击“保存”,根据界面提示操作后,等待配置保存成功。
- Spark服务端配置更新后,如果“配置状态”为“配置过期”,则需重启组件以使配置生效。
图1 修改Spark配置
在Spark服务概览页面,选择“更多 > 重启服务/滚动重启服务”,验证管理员密码后,等待服务重启成功。
如果使用Spark客户端提交任务,修改了集群的“spark.sql.orc.enableVectorizedReader”、“spark.sql.codegen.wholeStage”、“spark.sql.codegen.maxFields”和“spark.sql.orc.impl”参数后,需要重新下载客户端才能使配置生效,请参考使用MRS客户端。
组件重启期间将无法对外提供服务,可能会影响集群的上层业务正常运行,请在业务空闲期或确认操作无影响后再执行本操作。