跨源复杂数据的SQL查询优化
操作场景
本章节介绍如何打开或关闭跨源复杂数据的SQL查询优化功能。
操作步骤
- (可选)连接MPPDB数据源的准备
如果连接的数据源为MPPDB,由于MPPDB Driver文件“gsjdbc4.jar”和Spark中的jar包“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”包含了相同的类名,存在类名冲突的问题。因此在连接MPPDB数据库之前,需要执行以下步骤:
- 移除Spark中的“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”,由于Spark运行不依赖该jar包,因此将该jar包移动到其他目录(例如,移动到“/tmp”目录,不建议直接删除)不会影响Spark正常运行。
- 登录Spark服务端主机,移除“${BIGDATA_HOME}/FusionInsight_Spark2x_8.1.0.1/install/FusionInsight-Spark2x-3.1.1/spark/jars”路径下的“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”。
- 登录Spark客户端主机,移除“/opt/client/Spark2x/spark/jars”路径下的“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”。
- 在MPPDB的安装包中获取MPPDB Driver文件“gsjdbc4.jar”,并将该文件分别上传到以下位置:
- Spark服务端的“/${BIGDATA_HOME}/FusionInsight_Spark2x_8.1.0.1/install/FusionInsight-Spark2x-3.1.1/spark/jars”路径下。
- Spark客户端的“/opt/client/Spark2x/spark/jars”路径下。
- 更新存储在HDFS中的“/user/spark2x/jars/8.1.0.1/spark-archive-2x.zip”压缩包。
此处版本号8.1.0.1为示例,具体以实际环境的版本号为准。
- 使用客户端安装用户登录客户端所在节点。执行命令切换到客户端安装目录,例如“/opt/client”。
- 执行以下命令配置环境变量。
- 如果集群为安全模式,执行以下命令获得认证。
- 新建临时文件./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
- 切换到tmp目录,删除“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”文件,并将MPPDB Driver文件“gsjdbc4.jar”上传到tmp目录中,然后执行以下命令重新打包。
zip -r spark-archive-2x.zip *.jar
- 删除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
- 重启Spark服务,等重启成功后,重新启动Spark客户端。
- 移除Spark中的“gsjdbc4-VXXXRXXXCXXSPCXXX.jar”,由于Spark运行不依赖该jar包,因此将该jar包移动到其他目录(例如,移动到“/tmp”目录,不建议直接删除)不会影响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。