更新时间:2024-05-11 GMT+08:00

合并CBO优化

操作场景

Spark SQL默认支持基于规则的优化,但仅仅基于规则优化不能保证Spark选择更优的查询计划。CBO(Cost-Bsed Optimizer)是一种为SQL智能选择查询计划的技术。通过配置开启CBO后,CBO优化器可以基于表和列的统计信息,进行一系列的估算,最终选择出更优的查询计划。

操作步骤

要使用CBO优化,可以按照以下步骤进行优化。

  1. 需要先执行特定的SQL语句来收集所需的表和列的统计信息。

    SQL命令如下(根据具体情况选择需要执行的SQL命令):

    • 生成表级别统计信息(扫表):

      ANALYZE TABLE src COMPUTE STATISTICS

      生成sizeInBytes和rowCount。

      使用ANALYZE语句收集统计信息时,无法计算非HDFS数据源的表的文件大小。

    • 生成表级别统计信息(不扫表):

      ANALYZE TABLE src COMPUTE STATISTICS NOSCAN

      只生成sizeInBytes,如果原来已经生成过sizeInBytes和rowCount,而本次生成的sizeInBytes和原来的大小一样,则保留rowCount(若存在),否则清除rowCount。

    • 生成列级别统计信息

      ANALYZE TABLE src COMPUTE STATISTICS FOR COLUMNS a, b, c

      生成列统计信息,为保证一致性,会同步更新表统计信息。目前不支持复杂数据类型(如Seq, Map等)和HiveStringType的统计信息生成。

    • 显示统计信息

      DESC FORMATTED src

      在Statistics中会显示“xxx bytes, xxx rows”分别表示表级别的统计信息。也可以通过如下命令显示列统计信息:

      DESC FORMATTED src a

    使用限制:当前统计信息收集不支持针对分区表的分区级别的统计信息。

  1. 在Spark客户端的“spark-defaults.conf”配置文件中进行表1设置。
    表1 参数介绍

    参数

    描述

    默认值

    spark.sql.cbo.enabled

    CBO总开关。

    • true表示打开,
    • false表示关闭。

    要使用该功能,需确保相关表和列的统计信息已经生成。

    false

    spark.sql.cbo.joinReorder.enabled

    使用CBO来自动调整连续的inner join的顺序。

    • true:表示打开
    • false:表示关闭

    要使用该功能,需确保相关表和列的统计信息已经生成,且CBO总开关打开。

    false

    spark.sql.cbo.joinReorder.dp.threshold

    使用CBO来自动调整连续inner join的表的个数阈值。

    如果超出该阈值,则不会调整join顺序。

    12