更新时间:2024-11-29 GMT+08:00

配置矢量化读取ORC数据

配置场景

ORC文件格式是一种Hadoop生态圈中的列式存储格式,它最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。和Parquet文件格式类似,它并不是一个单纯的列式存储格式,仍然是首先根据行组分割整个表,在每一个行组内按列进行存储,并且文件中的数据尽可能的压缩来降低存储空间的消耗。矢量化读取ORC格式的数据能够大幅提升ORC数据读取性能。在Spark2.3版本中,SparkSQL支持矢量化读取ORC数据(这个特性在Hive的历史版本中已经得到支持)。矢量化读取ORC格式的数据能够获得比传统读取方式数倍的性能提升。

该特性可以通过下面的配置项开启:
  • “spark.sql.orc.enableVectorizedReader”:指定是否支持矢量化方式读取ORC格式的数据,默认为true。
  • “spark.sql.codegen.wholeStage”:指定是否需要将多个操作的所有stage编译为一个java方法,默认为true。
  • “spark.sql.codegen.maxFields”:指定codegen的所有stage所支持的最大字段数(包括嵌套字段),默认为100。
  • “spark.sql.orc.impl”:指定使用Hive还是Spark SQL native作为SQL执行引擎来读取ORC数据,默认为hive。

配置参数

登录FusionInsight Manager系统,选择“集群 > 服务 > Spark > 配置”,单击“全部配置”,搜索以下参数。

参数

说明

默认值

取值范围

spark.sql.orc.enableVectorizedReader

指定是否支持矢量化方式读取ORC格式的数据,默认为true。

true

[true,false]

spark.sql.codegen.wholeStage

指定是否需要将多个操作的所有stage编译为一个java方法,默认为true。

true

[true,false]

spark.sql.codegen.maxFields

指定codegen的所有stage所支持的最大字段数(包括嵌套字段),默认为100.

100

大于0

spark.sql.orc.impl

指定使用Hive还是Spark SQL native作为SQL执行引擎来读取ORC数据,默认为hive。

hive

[hive,native]

  1. 使用SparkSQL内置的矢量化方式读取ORC数据需要满足下面的条件:
    • spark.sql.orc.enableVectorizedReader : true,默认是true,一般不做修改。
    • spark.sql.codegen.wholeStage : true,默认为true,一般不做修改。
    • spark.sql.codegen.maxFields不小于scheme的列数。
    • 所有的数据类型均为AtomicType类型;所谓Atomic Type表示非NULL、UDTs、arrays,maps类型。如果列中存在这几种类型的任意一种,都无法获得预期的性能。
    • spark.sql.orc.impl : native ,默认为hive。
  2. 若使用客户端提交任务,“spark.sql.orc.enableVectorizedReader”“spark.sql.codegen.wholeStage”“spark.sql.codegen.maxFields”“spark.sql.orc.impl”、参数修改后需要重新下载客户端才能生效。
  3. 如下场景,矢量化读会出现结果不一致,例如'1456-01-01 12:00:55'会读成'1455-12-23 12:00:55'。此种场景需要关闭矢量读模式。
    • 使用Hive3写的ORC文件;或者当参数“spark.sql.orc.impl”值为hive时,使用Spark写的hive表ORC文件。
    • 存在时间戳字段类型(TimeStamp)。
    • 时间戳字段的值在1582年以前。