开发 JDBC 数据源

自 Apache Kylin v2.6.0 起有效

Data source SDK

自 Apache Kylin v2.6.0 起,我们提供一套新的数据源框架 Data source SDK,使用框架提供的API, 开发者可以很轻松实现一个新的数据源, 适配sql方言。

如何开发

实现新数据源的配置

Data source SDK 提供转换的机制, 框架里预定义一个配置文件 default.xml 对应ansi sql方言。

开发者不需要编码, 只需要为新的数据源新建一个配置文件 {dialect}.xml,

配置文件结构:
* 根节点:

  1. <DATASOURCE_DEF NAME="kylin" ID="mysql" DIALECT="mysql"/>

ID的值通常和配置文件的名字相同。
DIALECT的值的定义主要是为了区分不同数据库对于标识符的引用。
举个例子 Mysql 使用 ``, Microsoft sql server 使用 [].
Kylin 里定义的DIALECT 和 Apache Calcite 里定义DIALECT 的对应关系:

Kylin 里定义的方言Apache Calcite 里定义的方言
defaultSqlDialect.CALCITE
calciteSqlDialect.CALCITE
greenplumSqlDialect.DatabaseProduct.POSTGRESQL
postgresqlSqlDialect.DatabaseProduct.POSTGRESQL
mysqlSqlDialect.DatabaseProduct.MYSQL
sql.keyword-default-uppercasewhether <default> should be transform to uppercase
mssqlSqlDialect.DatabaseProduct.MSSQL
oracleSqlDialect.DatabaseProduct.ORACLE
verticaSqlDialect.DatabaseProduct.VERTICA
redshiftSqlDialect.DatabaseProduct.REDSHIFT
hiveSqlDialect.DatabaseProduct.HIVE
h2SqlDialect.DatabaseProduct.H2
unkownSqlDialect.DUMMY
  • 属性节点:
    定义方言的属性。
属性描述
sql.default-converted-enabled是否需要转换
sql.allow-no-offset是否允许没有offset字句
sql.allow-fetch-no-rows是否允许fetch 0 rows
sql.allow-no-orderby-with-fetchfetch是否必须跟orderby
sql.keyword-default-escape<default>是否是关键字
sql.keyword-default-uppercase<default> 是否需要转换成大写
sql.paging-type分页类型比如 LIMIT_OFFSET, FETCH_NEXT, ROWNUM
sql.case-sensitive是否大小写敏感
metadata.enable-cache是否开启缓存(针对开启大小写敏感)
sql.enable-quote-all-identifiers是否开启quote
transaction.isolation-level事务隔离级别(针对sqoop)
  • 方法节点:
    开发者可以根据数据源方言定义方法的实现。
    比如,我们想要实现 Greenplum 作为数据源,但是 Greenplum 不支持 TIMESTAMPDIFF 方法,那我们就可以在 greenplum.xml 里面定义
  1. <FUNCTION_DEF ID="64" EXPRESSION="(CAST($1 AS DATE) - CAST($0 AS DATE))"/>

对比在 default.xml 定义

  1. <FUNCTION_DEF ID="64" EXPRESSION="TIMESTAMPDIFF(day, $0, $1)"/>

Data source SDK 可以把 default 里定义相同 function id 方法转换成目标方言里的定义.

  • 类型节点:
    开发者可以根据数据源方言定义数据类型。
    还是拿 Greenplum 作为例子, Greenplum 支持 BIGINT 而不是 LONG, 那我们可以在 greenplum.xml 定义
  1. <TYPE_DEF ID="Long" EXPRESSION="BIGINT"/>

对比在 default.xml 定义

  1. <TYPE_DEF ID="Long" EXPRESSION="LONG"/>

Data source SDK 可以把 default 里定义相同 type id 方法转换成目标方言里的定义.

Adaptor

Adaptor 提供一系列的 API 比如从数据源获取元数据,数据等。
Data source SDK 提供了默认的实现,开发者可以创建一个类继承它,并且有自己的实现。

  1. org.apache.kylin.sdk.datasource.adaptor.DefaultAdaptor

Adaptor 还预留一个方法 fixSql(String sql).
如果根据配置文件转换之后的 sql 还是和目标方言有些适配问题, 开发者可以去实现这个方法做 sql 最后的修改.

部署

一些新的配置:

  1. kylin.query.pushdown.runner-class-name=org.apache.kylin.query.pushdown.PushdownRunnerSDKImpl
  2. kylin.source.default=16
  3. kylin.source.jdbc.dialect={JDBC 方言}
  4. kylin.source.jdbc.adaptor={JDBC 连接的数据源对应的适配器类名}
  5. kylin.source.jdbc.user={JDBC 连接用户名}
  6. kylin.source.jdbc.pass={JDBC 连接密码}
  7. kylin.source.jdbc.connection-url={JDBC 连接字符串}
  8. kylin.source.jdbc.driver={JDBC 驱动类名}

使用mysql作为例子:

  1. kylin.query.pushdown.runner-class-name=org.apache.kylin.query.pushdown.PushdownRunnerSDKImpl
  2. kylin.source.default=16
  3. kylin.source.jdbc.dialect=mysql
  4. kylin.source.jdbc.adaptor=org.apache.kylin.sdk.datasource.adaptor.MysqlAdaptor
  5. kylin.source.jdbc.user={mysql 用户名}
  6. kylin.source.jdbc.pass={mysql 用户密码}
  7. kylin.source.jdbc.connection-url=jdbc:mysql://{主机url}:3306/{数据库名称}
  8. kylin.source.jdbc.driver=com.mysql.jdbc.Driver

新增加的 {dialect}.xml 放置在 $KYLIN_HOME/conf/datasource 目录下。
新开发的 Adaptor 打成jar包后 放置在在 $KYLIN_HOME/ext 目录下。

其余的配置和更早的jdbc连接方式一致,请参考 setup_jdbc_datasource