配置矢量化读取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系统,选择“集群 > 待操作集群的名称 > 服务 > Spark2x > 配置”,单击“全部配置”,搜索以下参数。
| 
        参数  | 
      
        说明  | 
      
        默认值  | 
      
        取值范围  | 
     
|---|---|---|---|
| 
        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  | 
      
        >=1  | 
     
| 
        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”、参数修改后需要重新下载客户端才能生效。