使用Spark引擎执行SQL
为用户提供了两种使用OmniMV物化视图Spark引擎执行SQL的方式,均可用于重写SQL的物理执行计划。
前提条件
请参见安装特性完成OmniMV物化视图安装,并参见《Spark 部署指南》完成Spark的部署。
使用OmniMV物化视图执行SQL的方式
可以通过两种方式使用OmniMV物化视图Spark引擎执行SQL,均可自动进行执行计划重写。
- 方式一:进入spark-sql客户端手动执行SQL。
      
- 进入客户端。
        
- Spark 3.1.1。
          
1 2 3 4 5 6 7 8 9 10 11 12 13
spark-sql \ --deploy-mode client \ --driver-cores 5 \ --driver-memory 5g \ --num-executors 18 \ --executor-cores 21 \ --executor-memory 55g \ --master yarn \ --database 数据库名称 \ --name 任务名称 \ --jars /opt/omnimv/boostkit-omnimv-spark-3.1.1-1.2.0-aarch64.jar \ --conf 'spark.sql.extensions=com.huawei.boostkit.spark.OmniMV' \ --conf spark.sql.omnimv.metadata.path=/omnimv/plugin_metadata \
 - Spark 3.4.3。
          
1 2 3 4 5 6 7 8 9 10 11 12 13
spark-sql \ --deploy-mode client \ --driver-cores 5 \ --driver-memory 5g \ --num-executors 18 \ --executor-cores 21 \ --executor-memory 55g \ --master yarn \ --database 数据库名称 \ --name 任务名称 \ --jars /opt/omnimv/boostkit-omnimv-spark-3.4.3-1.2.0-aarch64.jar \ --conf 'spark.sql.extensions=com.huawei.boostkit.spark.OmniMV' \ --conf spark.sql.omnimv.metadata.path=/omnimv/plugin_metadata \
 
 - Spark 3.1.1。
          
 - Spark参数可根据集群配置进行调整。
 - 手动执行SQL。
 
 - 进入客户端。
        
 - 方式二:使用脚本批量执行SQL。
      
Spark参数可根据集群配置进行调整。主要是通过-f调用写好的SQL文件,用户仿照此例自定义脚本,批量执行SQL。例如:
- Spark 3.1.1。
        
1 2 3 4 5 6 7 8 9 10 11 12 13 14
spark-sql \ --deploy-mode client \ --driver-cores 5 \ --driver-memory 5g \ --num-executors 18 \ --executor-cores 21 \ --executor-memory 55g \ --master yarn \ --database 数据库名称 \ --name 任务名称 \ --jars /opt/omnimv/boostkit-omnimv-spark-3.1.1-1.2.0-aarch64.jar \ --conf 'spark.sql.extensions=com.huawei.boostkit.spark.OmniMV' \ --conf spark.sql.omnimv.metadata.path=/omnimv/plugin_metadata \ -f sql文件的实际路径
 - Spark 3.4.3。
        
1 2 3 4 5 6 7 8 9 10 11 12 13 14
spark-sql \ --deploy-mode client \ --driver-cores 5 \ --driver-memory 5g \ --num-executors 18 \ --executor-cores 21 \ --executor-memory 55g \ --master yarn \ --database 数据库名称 \ --name 任务名称 \ --jars /opt/omnimv/boostkit-omnimv-spark-3.4.3-1.2.0-aarch64.jar \ --conf 'spark.sql.extensions=com.huawei.boostkit.spark.OmniMV' \ --conf spark.sql.omnimv.metadata.path=/omnimv/plugin_metadata \ -f sql文件的实际路径
 
 - Spark 3.1.1。
        
 
OmniMV物化视图Spark引擎支持的语法
| 
          操作名称  | 
        
          操作语法  | 
       
|---|---|
| 
          Create MV(创建视图)  | 
        
          CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]mv_name [DISABLE REWRITE] [COMMENT 'mv_comment'] [PARTITIONED BY (col_name, ...)] AS <query>;  | 
       
| 
          Drop MV(删除视图)  | 
        
          DROP MATERIALIZED VIEW [IF EXISTS] [db_name.]mv_name;  | 
       
| 
          Show MVS(枚举视图)  | 
        
          SHOW MATERIALIZED VIEWS [ON [db_name.]mv_name];  | 
       
| 
          Alter MV rewrite(更新视图配置,是否参与重写)  | 
        
          ALTER MATERIALIZED VIEW [db_name.]mv_name ENABLE|DISABLE REWRITE;  | 
       
| 
          Refresh MV (更新视图数据)  | 
        
          REFRESH MATERIALIZED VIEW [db_name.]mv_name;  | 
       
| 
          WASH OUT MATERIALIZED VIEW(淘汰视图) --ALL:淘汰所有视图 --UNUSED_DAYS策略(默认):淘汰${UNUSED_DAYS}未使用过的视图 --RESERVE_QUANTITY_BY_VIEW_COUNT策略:保留使用次数前${RESERVE_QUANTITY_BY_VIEW_COUNT}的视图 --DROP_QUANTITY_BY_SPACE_CONSUMED策略:淘汰占用空间前${DROP_QUANTITY_BY_SPACE_CONSUMED}的视图  | 
        
          WASH OUT [ALL] MATERIALIZED VIEW [ USING [UNUSED_DAYS,] [RESERVE_QUANTITY_BY_VIEW_COUNT,] [DROP_QUANTITY_BY_SPACE_CONSUMED] ]  | 
       
OmniMV物化视图Spark启动参数信息
| 
          启动参数名称  | 
        
          缺省值  | 
        
          含义  | 
       
|---|---|---|
| 
          spark.sql.omnimv.enable  | 
        
          true  | 
        
          是否开启OmniMV物化视图改写。 
  | 
       
| 
          spark.sql.omnimv.show.length  | 
        
          50  | 
        
          show materialized views打印OmniMV物化视图信息的字符长度。  | 
       
| 
          spark.sql.omnimv.default.datasource  | 
        
          orc  | 
        
          OmniMV物化视图的存储格式,orc、parquet。  | 
       
| 
          spark.sql.omnimv.logLevel  | 
        
          DEBUG  | 
        
          OmniMV物化视图相关的日志级别,DEBUG、INFO、WARN、ERROR。  | 
       
| 
          spark.sql.omnimv.log.enable  | 
        
          true  | 
        
          是否把解析的SQL输出到event log。 
  | 
       
| 
          spark.sql.omnimv.metadata.path  | 
        
          /omnimv/plugin_metadata  | 
        
          OmniMV物化视图元数据HDFS路径。  | 
       
| 
          spark.sql.omnimv.metadata.initbyquery.enable  | 
        
          false  | 
        
          用于OmniMV物化视图元数据加载加速,是否只加载查询SQL用到的表相关的OmniMV物化视图元数据。 
  | 
       
| 
          spark.sql.omnimv.dbs  | 
        
          没有缺省值,请根据实际情况自行配置  | 
        
          用于OmniMV物化视图元数据加载加速,是否只加载某些数据库下的OmniMV物化视图元数据。可配置例如omnimv、omnimv1。  | 
       
| 
          spark.sql.omnimv.washout.automatic.enable  | 
        
          false  | 
        
          是否开启OmniMV物化视图的自动淘汰,自动删除旧的物化视图,默认采取UNUSED_DAYS策略。 true:开启OmniMV物化视图的自动淘汰。 false:不开启OmniMV物化视图的自动淘汰。  | 
       
| 
          spark.sql.omnimv.washout.unused.day  | 
        
          30  | 
        
          UNUSED_DAYS策略(默认),淘汰30天未被使用的视图。  | 
       
| 
          spark.sql.omnimv.washout.reserve.quantity.byViewCnt  | 
        
          25  | 
        
          RESERVE_QUANTITY_BY_VIEW_COUNT策略,按视图使用次数降序排序后,淘汰25名之后的。  | 
       
| 
          spark.sql.omnimv.washout.drop.quantity.bySpaceConsumed  | 
        
          3  | 
        
          DROP_QUANTITY_BY_SPACE_CONSUMED策略,按视图占用存储空间降序排序后,淘汰前3名。  | 
       
| 
          spark.sql.omnimv.washout.automatic.time.interval  | 
        
          35  | 
        
          两次OmniMV物化视图的自动淘汰执行,间隔多少天。  | 
       
| 
          spark.sql.omnimv.washout.automatic.checkTime.interval  | 
        
          3600  | 
        
          一个session里,尝试自动淘汰,间隔多少秒。  | 
       
| 
          spark.sql.omnimv.washout.automatic.view.quantity  | 
        
          20  | 
        
          触发自动淘汰的最少视图数量。  | 
       
| 
          spark.sql.omnimv.detect-rewrite-sqls.enable  | 
        
          false  | 
        
          用于OmniMV物化视图元数据加载加速,是否只针对视图可改写SQL生效,降低不生效SQL因元数据加载耗时带来的劣化。 true:只针对OmniMV物化视图可改写SQL生效。 false:针对所有SQL生效。  | 
       
OmniMV物化视图使用到Kryo相关的参数信息
OmniMV物化视图使用Kryo进行物化视图元数据序列化时,可能存在用户配置和OmniMV物化视图不兼容的情况,所以不使用用户的配置,使用固定配置,这并不影响Spark本身的功能。
| 
          参数名称  | 
        
          固定值  | 
        
          含义  | 
       
|---|---|---|
| 
          spark.kryo.unsafe  | 
        
          false  | 
        
          不使用Kryo的“unsafe”模式。  | 
       
| 
          spark.kryo.registrationRequired  | 
        
          false  | 
        
          不强制要求所有需要序列化的类都必须在Kryo中注册。  | 
       
| 
          spark.kryo.registrator  | 
        
          ""  | 
        
          不指定自定义的Kryo注册器类。  | 
       
| 
          spark.kryo.classesToRegister  | 
        
          ""  | 
        
          不指定需要注册的类列表。  | 
       
| 
          spark.kryo.pool  | 
        
          true  | 
        
          启用Kryo实例池。  | 
       
| 
          spark.kryo.referenceTracking  | 
        
          true  | 
        
          启用引用动向。  | 
       
| 
          spark.kryoserializer.buffer  | 
        
          64k  | 
        
          设置Kryo序列化缓冲区的初始大小。  | 
       
| 
          spark.kryoserializer.buffer.max  | 
        
          64m  | 
        
          设置Kryo序列化缓冲区的最大大小。  | 
       
查看OmniMV物化视图Spark引擎是否加载成功
- 使用方式一进入spark-sql客户端手动执行SQL。
 - 执行枚举视图命令,返回信息如下图所示,说明Plugin加载成功。
1SHOW MATERIALIZED VIEWS;

 - 创建样例基本表和样例视图。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
CREATE TABLE IF NOT EXISTS column_type( empid INT, deptno INT, locationid INT, booleantype BOOLEAN, bytetype BYTE, shorttype SHORT, integertype INT, longtype LONG, floattype FLOAT, doubletype DOUBLE, datetype DATE, timestamptype TIMESTAMP, stringtype STRING, decimaltype DECIMAL ); INSERT INTO TABLE column_type VALUES( 1,1,1,TRUE,1,1,1,1,1.0,1.0, DATE '2022-01-01', TIMESTAMP '2022-01-01', 'stringtype1',1.0 ); INSERT INTO TABLE column_type VALUES( 2,2,2,TRUE,2,2,2,2,2.0,2.0, DATE '2022-02-02', TIMESTAMP '2022-02-02', 'stringtype2',2.0 );

 - 创建物化视图。
1 2 3
CREATE MATERIALIZED VIEW IF NOT EXISTS mv_create1 AS SELECT * FROM column_type;

 - 通过EXPLAIN SQL,来查看查询的执行计划是否被重写。
1 2
EXPLAIN SELECT * FROM column_type;
