---
title: 使用Spark引擎执行SQL
description: "为用户提供了两种使用OmniMV物化视图Spark引擎执行SQL的方式，均可用于重写SQL的物理执行计划。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2530/bds/kunpengbds_omniruntime_20_0415.html
sourcePath: /source/zh/kunpengboostkithistory/2530/bds/kunpengbds_omniruntime_20_0415.html
indexId: 09084c616790baa68ff3660ee7981d4df8594df16b01881950b7991f8b5123b278
---
# 使用Spark引擎执行SQL

为用户提供了两种使用OmniMV物化视图Spark引擎执行SQL的方式，均可用于重写SQL的物理执行计划。

#### 前提条件

请参见安装特性完成OmniMV物化视图安装，并参见《Spark 部署指南(https://www.hikunpeng.com/document/detail/zh/kunpengbds/ecosystemEnable/Spark/kunpengspark_04_0001.html)》完成Spark的部署。


#### 使用OmniMV物化视图执行SQL的方式

可以通过两种方式使用OmniMV物化视图Spark引擎执行SQL，均可自动进行执行计划重写。

- 方式一：进入spark-sql客户端手动执行SQL。

  1. 进入客户端。

    - 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 \

  2. Spark参数可根据集群配置进行调整。
  3. 手动执行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文件的实际路径


#### OmniMV物化视图Spark引擎支持的语法


**表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启动参数信息


**表2 OmniMV物化视图Spark启动参数信息**

| 启动参数名称 | 缺省值 | 含义 |
| --- | --- | --- |
| spark.sql.omnimv.enable | true | 是否开启OmniMV物化视图改写。 true：开启OmniMV物化视图改写。 false：关闭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。 true：把解析的SQL输出到event log。 false：不把解析的SQL输出到event log。 |
| spark.sql.omnimv.metadata.path | /omnimv/plugin\_metadata | OmniMV物化视图元数据HDFS路径。 |
| spark.sql.omnimv.metadata.initbyquery.enable | false | 用于OmniMV物化视图元数据加载加速，是否只加载查询SQL用到的表相关的OmniMV物化视图元数据。 true：只加载查询SQL用到的表相关的OmniMV物化视图元数据。 false：加载查询所有的物化视图元数据。 |
| 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本身的功能。


**表3 OmniMV物化视图内部使用到Kryo相关的参数信息**

| 参数名称 | 固定值 | 含义 |
| --- | --- | --- |
| 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引擎是否加载成功

1. 使用方式一进入spark-sql客户端手动执行SQL。
2. 执行枚举视图命令，返回信息如下图所示，说明Plugin加载成功。
  1 SHOW MATERIALIZED VIEWS;

3. 创建样例基本表和样例视图。
  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 );

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

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