SQL on Spark
概述
SQL on Spark为用户提供访问Spark数据库实例的能力:发送SQL语句、处理返回结果。Extension Connector兼容了之前版本的此功能,并保留了原接口函数exec_hadoop_sql(text, text, text)。由于exec_hadoop_sql存在安全问题,只有赋权后才能使用,建议用户使用exec_on_extension函数。
连接Spark数据库实例时,函数exec_hadoop_sql和exec_on_extension的区别如下:
函数参数个数和意义不同:
exec_hadoop_sql(text,text,text)参数意义:DSN、SQL、Encoding。
exec_on_extension(text, text)参数意义:Data Source对象名称、SQL。
需要ODBC配置不同:
exec_hadoop_sql:当前执行节点上配置即可。
exec_on_extension:所有openGauss节点上均需配置。
执行方式不同:
exec_hadoop_sql:无需创建Data Source。
exec_on_extension:需要创建Data Source。
支持的Spark数据类型
SQL on Spark支持的数据类型,见下表。
表 1 SQL on Spark支持的Spark数据类型
须知:
- 对于Spark返回的数据类型,需要使用上表中对应的类型去接收(在AS子句中指定)。如果Spark返回的类型不在上表中,或没有按照指定对应关系去接收,则可能会出现结果不正确或转换失败。
- 当Spark端数据类型定义为CHAR(n)时,对于字符串长度小于n的情况会自动补齐空格,当这种数据传输到openGauss并转换为text类型时,字符串尾部的空格保留。
- openGauss的编码方式设置为SQL_ASCII时,length()函数返回的是字符串数据的字节数,而不是实际的字符数。例如,下面查询exec_on_extension返回数据的length时:select c2,length(c2) from exec_on_extension(‘spark’,’select * from a;’) as (c1 int, c2 text);
返回的第二列为字符串的字节数,而不是实际字符数。exec_hadoop_sql也有此特征。
使用前的对接配置
以下以使用exec_on_extension为例进行说明。以exec_hadoop_sql连接Spark时,无需创建Data Source。
- 以操作系统用户omm登录数据库主节点。
准备package.zip压缩包,放置于$GAUSSHOME/utilslib/fc_conf/$DSN下。路径不存在部分用户可自行创建,$DSN为以DSN为名的文件夹。DSN名必须由字母、数字、下划线组成。压缩包包含如下内容:
- KrbClient.zip
- datasight-hiveodbc-1.0.0-1.el6.x86_64.rpm
- kuser_1544261037803_keytab.tar
执行如下命令生成压缩包:
zip -r package.zip KrbClient.zip datasight-hiveodbc-1.0.0-1.el6.x86_64.rpm kuser_1544261037803_keytab.tar
其中,KrbClient.zip为需要连接的spark客户端中的kerberos客户端,kuser_1544261037803_keytab.tar为需要连接的用户认证凭据,datasight-hiveodbc-1.0.0-1.el6.x86_64.rpm为sparkodbc安装包。具体获取方式参考如下:
a. 登录要连接的对端Spark数据库实例。
b. 在主界面点击右上角“更多”选项,选择“下载客户端”进行下载。解压下载好的客户端,得到FusionInsight_Services_ClientConfig.tar压缩包,解压后进入FusionInsight_Services_ClientConfig目录下,按照准备package.zip包的方式打包KrbClient为KrbClient.zip。
c. 进入FusionInsight_Services_ClientConfig的Spark2x目录下,解压DataSight_Spark_V100R002C50RC2SPC200_HiveODBC.zip。进入解压后生成的Linux目录下,根据操作系统版本选择对应的rpm包。Red Hat/Centos:datasight-hiveodbc-1.0.0-1.el6.x86_64.rpm。SUSE:datasight-hiveodbc-1.0.0-1.x86_64.rpm。
d. 在主界面点击最上方的“系统”选项进入用户界面。选择需要连接Spark的用户,点击“更多”选择认证凭据,下载kuser_1544261037803_keytab.tar。
在$GAUSSHOME/utilslib/fc_conf/$DSN下生成DSN.ini文件。用户需保证文件内容与格式正确。参考示例如下:
[spark]
MODE=0
HOST=10.185.178.151
PORT=23040
DATABASE=zyl
PRINCIPAL=spark/hadoop.hadoop.com@HADOOP.COM
FRAMED=0
NAMESPACE=sparkthriftserver
principal="kuser@HADOOP.COM"
安装datasight-hiveodbc。
mkdir $GAUSSHOME/utilslib/fc_conf/$DSN/sparkodbc
Red Hat/Centos环境:
rpm -ivh --nofiledigest $GAUSSHOME/utilslib/fc_conf/$DSN/datasight-hiveodbc-1.0.0-1.el6.x86_64.rpm --nodeps --force --prefix=$GAUSSHOME/utilslib/fc_conf/$DSN/sparkodbc
SUSE环境:
rpm -ivh --nofiledigest $GAUSSHOME/utilslib/fc_conf/$DSN/datasight-hiveodbc-1.0.0-1.x86_64.rpm --nodeps --force --prefix=$GAUSSHOME/utilslib/fc_conf/$DSN/sparkodbc
执行EC自动化部署命令。部署完成后,在所有节点分别执行kinit命令,生成用户对应的票据。
gs_om -t ec -m add -N DSN -U username --type=spark
gs_om -t ec -m add -N DSN -U username --type=spark -L # -L为本地模式
kinit kuser #这里的kuser指的是对端数据库实例上用来连接访问的用户
执行如下命令,重启数据库实例,终止om_monitor进程,以使openGauss的进程感知到环境变量的变化。
gs_om -t ec -m restart -U username
gs_om -t ec -m restart -U username -L #-L为本地模式
gs_om -t stop && gs_om -t start # 仅本地模式执行
说明:
创建Data Source。
可以参考如下操作:
a. 连接数据库。
b. 创建Data Source。
```
openGauss=# CREATE DATA SOURCE spark_ds OPTIONS(DSN 'spark_odbc', encoding 'utf8');
```
各字段含义、对象修改方法与SQL on Oracle中的[9](SQL-on-Oracle.md#li18691619432)类似。
连接Spark。
详见下面示例。
注意事项
- 采用认证信息和文件连接的方式时,Data Source对象中可以不用提供username和password,若提供则会将此信息传给unixODBC。
- 用户需要保证package.zip中的内容完整,DSN.ini中的内容正确。安装部署完成后不进行修改,否则搭建好的环境有无法正常使用的风险。
- Extension Connector仅支持连接单个Spark数据库实例。若建立多个Spark连接,则会产生认证冲突。
- 修改Spark数据库实例的用户密码会导致认证凭据失效。需要在主界面点击最上方的“系统”选项进入用户界面。选择需要连接Spark的用户,点击“更多”,选择认证凭据后重新下载。再把下载好的认证凭据上传至GAUSSHOME/utilslib/fc_conf/DSN/路径下。其中DSN为用户自定义DSN名。然后解压认证凭据替换已有文件。最后修改认证凭据属主为数据库实例用户。
- 要求Spark ODBC必须用gcc 7.3及以上版本编译。
示例
-- 假设Spark里已经存在表 t1 (c1 int, c2 string), 内容如下:
-- 1 spark
-- 2 hive
-- 通过 exec_hadoop_sql 函数查询,其中spark_odbc是odbc.ini中对应Spark的DSN,
openGauss=# SELECT * FROM exec_hadoop_sql('spark_odbc', 'select * from t1;', '') AS (c1 int, c2 text);
c1 | c2
----+-------
1 | spark
2 | hive
(2 rows)
-- 通过 exec_on_extension 函数查询
openGauss=# CREATE DATA SOURCE spark_ds OPTIONS(dsn 'spark_odbc');
openGauss=# SELECT * FROM exec_on_extension ('spark_ds', 'select * from t1;') AS (c1 int, c2 text);
c1 | c2
----+-------
1 | spark
2 | hive
(2 rows)
openGauss=# DROP DATA SOURCE spark_ds;
异常处理
EC对接openGauss时产生的常见异常,请参见表2。
表 2 常见EC对接openGauss的异常处理
[GAUSS-50201] : The $GAUSSHOME/utilslib/fc_conf/ora/ does not exist. |
查看自动化部署log,根据日志中的报错信息,处理异常。解决异常后重新进行部署。
|
|
需要创建DATA SOURCE,创建语句请参考CREATE DATA SOURCE。 |
||
查看EC支持的LirbA数据类型。请参见表1。 |
||
ERROR: dn_6033_6034: DSN:spark2x,Fail to get data from ODBC connection! Detail can be found in node log of ‘dn_6033_6034’. |
相关链接
CREATE DATA SOURCE,《工具参考》中“服务端工具 > gs_om”章节