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

跨源复杂数据的SQL查询优化

操作场景

本章节介绍如何打开或关闭跨源复杂数据的SQL查询优化功能。

操作步骤

  • (可选)连接MPPDB数据源的准备

    如果连接的数据源为MPPDB,由于MPPDB Driver文件“gsjdbc4.jar”和Spark中的jar包“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”包含了相同的类名,存在类名冲突的问题。因此在连接MPPDB数据库之前,需要执行以下步骤:

    1. 移除Spark中的“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”,由于Spark运行不依赖该jar包,因此将该jar包移动到其他目录(例如,移动到“/tmp”目录,不建议直接删除)不会影响Spark正常运行。
      1. 登录Spark服务端主机,移除“${BIGDATA_HOME}/FusionInsight_Spark2x_8.1.0.1/install/FusionInsight-Spark2x-*/spark/jars”路径下的“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”
      2. 登录Spark客户端主机,移除“/opt/client/Spark2x/spark/jars”路径下的“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”
    2. 在MPPDB的安装包中获取MPPDB Driver文件“gsjdbc4.jar”,并将该文件分别上传到以下位置:

      “gsjdbc4.jar”在MPPDB安装包的目录“FusionInsight_MPPDB\software\components\package\FusionInsight-MPPDB-xxx\package\Gauss-MPPDB-ALL-PACKAGES\GaussDB-xxx-REDHAT-xxx-Jdbc\jdbc”中获取。

      • Spark服务端的“/${BIGDATA_HOME}/FusionInsight_Spark2x_8.1.0.1/install/FusionInsight-Spark2x-*/spark/jars”路径下。
      • Spark客户端的“/opt/client/Spark2x/spark/jars”路径下。
    3. 更新存储在HDFS中的“/user/spark2x/jars/8.1.0.1/spark-archive-2x.zip”压缩包。

      此处版本号8.1.0.1为示例,具体以实际环境的版本号为准。

      1. 使用客户端安装用户登录客户端所在节点。执行命令切换到客户端安装目录,例如“/opt/client”。

        cd /opt/client

      2. 执行以下命令配置环境变量。

        source bigdata_env

      3. 如果集群为安全模式,执行以下命令获得认证。

        kinit 组件业务用户

      4. 新建临时文件./tmp,并从HDFS获取“spark-archive-2x.zip”并解压到tmp目录,命令如下:

        mkdir tmp

        hdfs dfs -get /user/spark2x/jars/8.1.0.1/spark-archive-2x.zip ./

        unzip spark-archive-2x.zip -d ./tmp

      5. 切换到tmp目录,删除“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”文件,并将MPPDB Driver文件“gsjdbc4.jar”上传到tmp目录中,然后执行以下命令重新打包。

        zip -r spark-archive-2x.zip *.jar

      6. 删除HDFS上的“spark-archive-2x.zip”,将步骤3.e中新生成的压缩包“spark-archive-2x.zip”更新至HDFS的“/user/spark2x/jars/8.1.0.1/”路径下。

        hdfs dfs -rm /user/spark2x/jars/8.1.0.1/spark-archive-2x.zip

        hdfs dfs -put ./spark-archive-2x.zip /user/spark2x/jars/8.1.0.1

    4. 重启Spark服务,等重启成功后,重新启动Spark客户端。
  • 打开优化开关

    对所有支持查询下推的模块,可以通过在spark-beeline客户端中执行SET命令打开跨源查询优化功能,默认均为关闭状态。

    可以从全局、数据源、表这三个维度进行下推开关控制。打开方法如下:

    • 全局(对所有数据源生效):

      SET spark.sql.datasource.jdbc = project,aggregate,orderby-limit

    • 数据源:

      SET spark.sql.datasource.${url} = project,aggregate,orderby-limit

    • 表:

      SET spark.sql.datasource.${url}.${table} = project,aggregate,orderby-limit

    执行SET命令设置上述参数时,允许一次设置多个下推模块,中间以逗号分隔。各个下推模块对应的参数值如下所示:

    表1 各模块对应的参数值

    模块名称

    SET命令的参数值

    project

    project

    aggregate

    aggregate

    order by,limit over project or aggregate

    orderby-limit

    示例:创建一个MySQL的外表的语句为:

    create table if not exists pdmysql using org.apache.spark.sql.jdbc options(driver "com.mysql.jdbc.Driver", url "jdbc:mysql://ip2:3306/test", user "hive", password "xxx", dbtable "mysqldata");

    则其中:

    • ${url} = jdbc:mysql://ip2:3306/test
    • ${table} = mysqldata
    • “=”后即设置可以下推打开的算子,以“,”隔开。
    • 优先级:table开关>数据源开关>全局开关。即若设置了table开关,则数据源开关全局开关对该表失效;若配置了数据源开关,则全局开关对该数据源失效。
    • url中不能包含“=”,若包含,set时直接删掉“=”。
    • 可多次执行set,key不同不会相互覆盖。
  • 新增支持查询下推的函数

    除了支持对abs()、month()、length()等数学、时间、字符串函数进行查询下推外,用户还可以通过SET命令新增数据源支持查询下推的函数。在spark-beeline客户端中执行如下命令:

    SET spark.sql.datasource.${datasource}.functions = fun1,fun2

  • 取消开关设置及取消新增的下推函数

    当前只能通过在spark-beeline客户端中执行RESET命令取消所有SET的内容。由于执行RESET后所有SET的参数值都将被清除,请谨慎使用。

    控制开关的设置仅在客户端当前的会话中生效,当客户端关闭后,SET内容就失效了。

    或者修改客户端配置文件spark-defaults.conf中的spark.sql.locale.support参数为true。

注意事项

数据源只支持MySQL和MPPDB,Hive,oracle, postgresql。