配置矢量化读取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] |
- 使用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。
- 若使用客户端提交任务,“spark.sql.orc.enableVectorizedReader”、“spark.sql.codegen.wholeStage”、“spark.sql.codegen.maxFields”、“spark.sql.orc.impl”、参数修改后需要重新下载客户端才能生效。
- 如下场景,矢量化读会出现结果不一致,例如'1456-01-01 12:00:55'会读成'1455-12-23 12:00:55'。此种场景需要关闭矢量读模式。
- 使用Hive3写的ORC文件;或者当参数“spark.sql.orc.impl”值为hive时,使用Spark写的hive表ORC文件。
- 存在时间戳字段类型(TimeStamp)。
- 时间戳字段的值在1582年以前。