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数据类型

本地openGauss数据类型

NUMERIC

TINYINT

SMALLINT

SMALLINT

SMALLINT

INTEGER

INTEGER

BIGINT

BIGINT

FLOAT

DOUBLE PRECISION

DOUBLE

DECIMAL

STRING

STRING

TEXT

VARCHAR

CHAR

BOOLEAN

BOOLEAN

BOOLEAN

DATE

TIMESTAMP

TIMESTAMP

DATE

DATE

SQL on Spark - 图1 须知:

  • 对于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。

  1. 以操作系统用户omm登录数据库主节点。
  2. 准备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

    执行如下命令生成压缩包:

    1. 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。

  3. 在$GAUSSHOME/utilslib/fc_conf/$DSN下生成DSN.ini文件。用户需保证文件内容与格式正确。参考示例如下:

    1. [spark]
    2. MODE=0
    3. HOST=10.185.178.151
    4. PORT=23040
    5. DATABASE=zyl
    6. PRINCIPAL=spark/hadoop.hadoop.com@HADOOP.COM
    7. FRAMED=0
    8. NAMESPACE=sparkthriftserver
    9. principal="kuser@HADOOP.COM"
  4. 安装datasight-hiveodbc。

    1. mkdir $GAUSSHOME/utilslib/fc_conf/$DSN/sparkodbc

    Red Hat/Centos环境:

    1. 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环境:

    1. 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
  5. 执行EC自动化部署命令。部署完成后,在所有节点分别执行kinit命令,生成用户对应的票据。

    1. gs_om -t ec -m add -N DSN -U username --type=spark
    2. gs_om -t ec -m add -N DSN -U username --type=spark -L # -L为本地模式
    3. kinit kuser #这里的kuser指的是对端数据库实例上用来连接访问的用户

    SQL on Spark - 图2 说明: 使用本地模式时,需要在各个节点上分别执行1-3

  6. 执行如下命令,重启数据库实例,终止om_monitor进程,以使openGauss的进程感知到环境变量的变化。

    1. gs_om -t ec -m restart -U username
    2. gs_om -t ec -m restart -U username -L #-L为本地模式
    3. gs_om -t stop && gs_om -t start # 仅本地模式执行

    SQL on Spark - 图3 说明:

    • 使用本地模式时,需要在各个节点上分别执行1-4

    • 本地模式不启停数据库实例,因此需要手动执行启停命令。

  7. 创建Data Source。

    可以参考如下操作:

    a. 连接数据库

    b. 创建Data Source。

    1. ```
    2. openGauss=# CREATE DATA SOURCE spark_ds OPTIONS(DSN 'spark_odbc', encoding 'utf8');
    3. ```
    4. 各字段含义、对象修改方法与SQL on Oracle中的[9](SQL-on-Oracle.md#li18691619432)类似。
  8. 连接Spark。

    详见下面示例

注意事项

  1. 采用认证信息和文件连接的方式时,Data Source对象中可以不用提供username和password,若提供则会将此信息传给unixODBC。
  2. 用户需要保证package.zip中的内容完整,DSN.ini中的内容正确。安装部署完成后不进行修改,否则搭建好的环境有无法正常使用的风险。
  3. Extension Connector仅支持连接单个Spark数据库实例。若建立多个Spark连接,则会产生认证冲突。
  4. 修改Spark数据库实例的用户密码会导致认证凭据失效。需要在主界面点击最上方的“系统”选项进入用户界面。选择需要连接Spark的用户,点击“更多”,选择认证凭据后重新下载。再把下载好的认证凭据上传至GAUSSHOME/utilslib/fc_conf/DSN/路径下。其中DSN为用户自定义DSN名。然后解压认证凭据替换已有文件。最后修改认证凭据属主为数据库实例用户。
  5. 要求Spark ODBC必须用gcc 7.3及以上版本编译。

示例

  1. -- 假设Spark里已经存在表 t1 (c1 int, c2 string), 内容如下:
  2. -- 1 spark
  3. -- 2 hive
  4. -- 通过 exec_hadoop_sql 函数查询,其中spark_odbcodbc.ini中对应SparkDSN
  5. openGauss=# SELECT * FROM exec_hadoop_sql('spark_odbc', 'select * from t1;', '') AS (c1 int, c2 text);
  6. c1 | c2
  7. ----+-------
  8. 1 | spark
  9. 2 | hive
  10. (2 rows)
  11. -- 通过 exec_on_extension 函数查询
  12. openGauss=# CREATE DATA SOURCE spark_ds OPTIONS(dsn 'spark_odbc');
  13. openGauss=# SELECT * FROM exec_on_extension ('spark_ds', 'select * from t1;') AS (c1 int, c2 text);
  14. c1 | c2
  15. ----+-------
  16. 1 | spark
  17. 2 | hive
  18. (2 rows)
  19. openGauss=# DROP DATA SOURCE spark_ds;

异常处理

EC对接openGauss时产生的常见异常,请参见表2

表 2 常见EC对接openGauss的异常处理

异常分类

报错信息

异常处理

部署异常

[GAUSS-50201] : The $GAUSSHOME/utilslib/fc_conf/ora/ does not exist.

查看自动化部署log,根据日志中的报错信息,处理异常。解决异常后重新进行部署。

log所在路径如下:

  • 默认路径为$GAUSSLOG/om。
  • 使用gs_om工具进行自动化部署时,如果指定了-l参数,则日志存放在指定位置。

连接异常

ERROR: source “spark_ds” does not exist.

需要创建DATA SOURCE,创建语句请参考CREATE DATA SOURCE

执行异常

ERROR: invalid input syntax for integer.

查看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’.

DETAIL: SQL_ERROR: cast unexpected type to date/timestamp.

如果执行的SQL语句中spark返回的数据类型与预期的数据类型不匹配,就会出现这类报错。

如果SQL执行时有其他语法错误,EC也会将spark端的错误信息返回。

相关链接

CREATE DATA SOURCE《工具参考》中“服务端工具 > gs_om”章节