鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

使用Spark引擎执行SQL

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

前提条件

请参见安装特性完成OmniMV物化视图安装,并参见《Spark 部署指南》完成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;