JDBC

本文主要介绍在 Linkis 中, JDBC 引擎插件的安装、使用和配置。

如果您希望在您的服务器上使用 JDBC 引擎,您需要准备 JDBC 连接信息,如 MySQL 数据库的连接地址、用户名和密码等

  1. mysql -uroot -P 3306 -h 127.0.0.1 -p 123456

输出如下信息代表 JDBC 连接信息可用

  1. mysql: [Warning] Using a password on the command line interface can be insecure.
  2. Welcome to the MySQL monitor. Commands end with ; or \g.
  3. Your MySQL connection id is 9
  4. Server version: 5.7.39 MySQL Community Server (GPL)
  5. Copyright (c) 2000, 2022, Oracle and/or its affiliates.
  6. Oracle is a registered trademark of Oracle Corporation and/or its
  7. affiliates. Other names may be trademarks of their respective
  8. owners.
  9. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  10. mysql>

方式一:直接下载引擎插件包

Linkis 引擎插件下载

方式二:单独编译引擎插件(需要有 maven 环境)

  1. # 编译
  2. cd ${linkis_code_dir}/linkis-engineconn-plugins/jdbc/
  3. mvn clean install
  4. # 编译出来的引擎插件包,位于如下目录中
  5. ${linkis_code_dir}/linkis-engineconn-plugins/jdbc/target/out/

EngineConnPlugin 引擎插件安装

将 2.1 中的引擎插件包上传到服务器的引擎目录下

  1. ${LINKIS_HOME}/lib/linkis-engineconn-plugins

上传后目录结构如下所示

  1. linkis-engineconn-plugins/
  2. ├── jdbc
  3. ├── dist
  4. └── 4
  5. ├── conf
  6. └── lib
  7. └── plugin
  8. └── 4

通过重启 linkis-cg-linkismanager 服务刷新引擎

  1. cd ${LINKIS_HOME}/sbin
  2. sh linkis-daemon.sh restart cg-linkismanager

可以查看数据库中的 linkis_engine_conn_plugin_bml_resources 这张表的 last_update_time 是否为触发刷新的时间。

  1. #登陆到 `linkis` 的数据库
  2. select * from linkis_cg_engine_conn_plugin_bml_resources;
  1. sh ./bin/linkis-cli -engineType jdbc-4 \
  2. -codeType jdbc -code "show tables" \
  3. -submitUser hadoop -proxyUser hadoop \
  4. -runtimeMap wds.linkis.jdbc.connect.url=jdbc:mysql://127.0.0.1:3306/linkis_db \
  5. -runtimeMap wds.linkis.jdbc.driver=com.mysql.jdbc.Driver \
  6. -runtimeMap wds.linkis.jdbc.username=test \
  7. -runtimeMap wds.linkis.jdbc.password=123456

更多 Linkis-Cli 命令参数参考: Linkis-Cli 使用

Linkis 提供了 JavaScalaSDKLinkis 服务端提交任务。具体可以参考 JAVA SDK Manual。对于 JDBC 任务您只需要修改 Demo 中的 EngineConnTypeCodeType 参数即可:

  1. Map<String, Object> labels = new HashMap<String, Object>();
  2. labels.put(LabelKeyConstant.ENGINE_TYPE_KEY, "jdbc-4"); // required engineType Label
  3. labels.put(LabelKeyConstant.USER_CREATOR_TYPE_KEY, "hadoop-IDE");// required execute user and creator
  4. labels.put(LabelKeyConstant.CODE_TYPE_KEY, "jdbc"); // required codeType

Linkis 1.2.0 开始,提供了 JDBC 引擎多数据源的支持,我们首先可以在控制台管理不同的数据源。地址:登陆管理台—>数据源管理—>新增数据源

JDBC - 图1

图3-3 数据源管理

JDBC - 图2

图3-4 数据源连接测试

数据源添加完成之后,就可以使用 JDBC 引擎的多数据源切换功能,有两种方式: 1、 通过接口参数指定数据源名称参数 参数示例:

  1. {
  2. "executionContent": {
  3. "code": "show databases",
  4. "runType": "jdbc"
  5. },
  6. "params": {
  7. "variable": {},
  8. "configuration": {
  9. "startup": {},
  10. "runtime": {
  11. "wds.linkis.engine.runtime.datasource": "test_mysql"
  12. }
  13. }
  14. },
  15. "source": {
  16. "scriptPath": ""
  17. },
  18. "labels": {
  19. "engineType": "jdbc-4",
  20. "userCreator": "hadoop-IDE"
  21. }
  22. }

参数:wds.linkis.engine.runtime.datasource 为固定名称的配置,不要随意修改名称定义

2、 通过 DSSScripts 代码提交入口下拉筛选需要提交的数据源,如下图: JDBC - 图3 当前 dss-1.1.0 还暂不支持下拉选择数据源名称, PR 在开发中,可以等后续发版或关注相关 PR : (https://github.com/WeBankFinTech/DataSphereStudio/issues/940)

多数据源的功能说明:

1)在之前的版本中, JDBC 引擎对数据源的支持不够完善,尤其是搭配 Scripts 使用的时候, JDBC 脚本类型只能绑定控制台的一套 JDBC 引擎参数, 当我们有多数据源的切换需求时,只能修改 JDBC 引擎的连接参数,比较麻烦。

2)配合数据源管理,我们引入 JDBC 引擎的多数据源切换功能,可以实现只设置数据源名称,就可把作业提交到不同的 JDBC 服务之上,普通用户不需要 维护数据源的连接信息,避免了配置繁琐,也满足了数据源连接密码等配置的安全性需要。

3)多数据源管理中设置的数据源,只有发布之后,并且没有过期的数据源才能被 JDBC 引擎加载到,否则会反馈给用户不同类型的异常提示。

4) JDBC 引擎参数的加载优先级为:任务提交传参 > 选择数据源的参数 > 控制台JDBC引擎的参数

配置默认值是否必须说明
wds.linkis.jdbc.connect.urljdbc:mysql://127.0.0.1:10000jdbc连接地址
wds.linkis.jdbc.driverjdbc连接驱动
wds.linkis.jdbc.username数据库连接用户名
wds.linknis.jdbc.password数据库链接密码
wds.linkis.jdbc.connect.max10jdbc引擎最大连接数
wds.linkis.jdbc.versionjdbc4jdbc版本

如果默认参数不满足时,有如下几中方式可以进行一些基础参数配置

jdbc

注意: 修改 IDE 标签下的配置后需要指定 -creator IDE 才会生效(其它标签类似),如:

  1. sh ./bin/linkis-cli -creator IDE \
  2. -engineType jdbc-4 -codeType jdbc \
  3. -code "show tables" \
  4. -submitUser hadoop -proxyUser hadoop

提交任务接口,通过参数 params.configuration.runtime 进行配置

  1. http 请求参数示例
  2. {
  3. "executionContent": {"code": "show databases;", "runType": "jdbc"},
  4. "params": {
  5. "variable": {},
  6. "configuration": {
  7. "runtime": {
  8. "wds.linkis.jdbc.connect.url":"jdbc:mysql://127.0.0.1:3306/test",
  9. "wds.linkis.jdbc.driver":"com.mysql.jdbc.Driver",
  10. "wds.linkis.jdbc.username":"test",
  11. "wds.linkis.jdbc.password":"test23"
  12. }
  13. }
  14. },
  15. "labels": {
  16. "engineType": "jdbc-4",
  17. "userCreator": "hadoop-IDE"
  18. }
  19. }

Linkis 是通过引擎标签来进行管理的,所涉及的数据表信息如下所示。

  1. linkis_ps_configuration_config_key: 插入引擎的配置参数的key和默认values
  2. linkis_cg_manager_label:插入引擎label如:jdbc-4
  3. linkis_ps_configuration_category 插入引擎的目录关联关系
  4. linkis_ps_configuration_config_value 插入引擎需要展示的配置
  5. linkis_ps_configuration_key_engine_relation:配置项和引擎的关联关系

表中与引擎相关的初始数据如下

  1. -- set variable
  2. SET @JDBC_LABEL="jdbc-4";
  3. SET @JDBC_ALL=CONCAT('*-*,',@JDBC_LABEL);
  4. SET @JDBC_IDE=CONCAT('*-IDE,',@JDBC_LABEL);
  5. -- engine label
  6. insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @JDBC_ALL, 'OPTIONAL', 2, now(), now());
  7. insert into `linkis_cg_manager_label` (`label_key`, `label_value`, `label_feature`, `label_value_size`, `update_time`, `create_time`) VALUES ('combined_userCreator_engineType', @JDBC_IDE, 'OPTIONAL', 2, now(), now());
  8. select @label_id := id from linkis_cg_manager_label where `label_value` = @JDBC_IDE;
  9. insert into linkis_ps_configuration_category (`label_id`, `level`) VALUES (@label_id, 2);
  10. -- configuration key
  11. insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.url', '例如:jdbc:mysql://127.0.0.1:10000', 'jdbc连接地址', 'jdbc:mysql://127.0.0.1:10000', 'Regex', '^\\s*jdbc:\\w+://([^:]+)(:\\d+)(/[^\\?]+)?(\\?\\S*)?$', '0', '0', '1', '数据源配置', 'jdbc');
  12. insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.driver', '例如:com.mysql.jdbc.Driver', 'jdbc连接驱动', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc');
  13. insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.version', '取值范围:jdbc3,jdbc4', 'jdbc版本','jdbc4', 'OFT', '[\"jdbc3\",\"jdbc4\"]', '0', '0', '1', '用户配置', 'jdbc');
  14. insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.username', 'username', '数据库连接用户名', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc');
  15. insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.password', 'password', '数据库连接密码', '', 'None', '', '0', '0', '1', '用户配置', 'jdbc');
  16. insert into `linkis_ps_configuration_config_key` (`key`, `description`, `name`, `default_value`, `validate_type`, `validate_range`, `is_hidden`, `is_advanced`, `level`, `treeName`, `engine_conn_type`) VALUES ('wds.linkis.jdbc.connect.max', '范围:1-20,单位:个', 'jdbc引擎最大连接数', '10', 'NumInterval', '[1,20]', '0', '0', '1', '数据源配置', 'jdbc');
  17. -- key engine relation
  18. insert into `linkis_ps_configuration_key_engine_relation` (`config_key_id`, `engine_type_label_id`)
  19. (select config.id as `config_key_id`, label.id AS `engine_type_label_id` FROM linkis_ps_configuration_config_key config
  20. INNER JOIN linkis_cg_manager_label label ON config.engine_conn_type = 'jdbc' and label_value = @JDBC_ALL);
  21. insert into `linkis_ps_configuration_config_value` (`config_key_id`, `config_value`, `config_label_id`)
  22. (select `relation`.`config_key_id` AS `config_key_id`, '' AS `config_value`, `relation`.`engine_type_label_id` AS `config_label_id` FROM linkis_ps_configuration_key_engine_relation relation
  23. INNER JOIN linkis_cg_manager_label label ON relation.engine_type_label_id = label.id AND label.label_value = @JDBC_ALL);