Kettle9.4支持Clickhouse数据源插件开发以及性能测试

前言

最近业务这边有个指标需要用到大数据这边的列式数据库进行处理,由于kettle不支持clickhouse数据源驱动,这里查了一下网上的相关资料,发现了一些别人开发好的驱动包,下载下来后使用效果不尽人意。总结下来有以下几个问题:

  • 不支持schema目录展示

  • 生成的DDL语句无法执行,右键预览数据报错

  • 查询数据出现错误

注意:低版本的kettle即使装ClickHouse驱动包后也不一定支持ClickHouse数据库连接(具体受clickhouse的驱动包编译版本限制,目前自己测试的最低支持到kettle 7.1),只有高版本的kettle在安装ClickHouse驱动包后才支持ClickHouse数据库连接,因此这里使用的时比较稳定的9.4.0版本。

源码分析

综上所述,我基于上述问题进行了驱动包的改造,首先是无非基于schema进行层级预览,导致很多表都混合在一起,不方便查看,这里我研究了一下kettle的源码:

//DatabaseMeta.java

public String[] getSchemas() throws KettleDatabaseException {
  ArrayList<String> catalogList = new ArrayList<>();
  ResultSet catalogResultSet = null;
  try {
    catalogResultSet = databaseMeta.getSchemas( getDatabaseMetaData() );
    // Grab all the catalog names and put them in an array list
    while ( catalogResultSet != null && catalogResultSet.next() ) {
      catalogList.add( catalogResultSet.getString( 1 ) );
    }
  } catch ( SQLException e ) {
    throw new KettleDatabaseException( "Error getting schemas!", e );
  } finally {
    try {
      if ( catalogResultSet != null ) {
        catalogResultSet.close();
      }
    } catch ( SQLException e ) {
      throw new KettleDatabaseException( "Error closing resultset after getting schemas!", e );
    }
  }

  if ( log.isDetailed() ) {
    log.logDetailed( "read :" + catalogList.size() + " schemas from db meta-data." );
  }

  return catalogList.toArray( new String[ catalogList.size() ] );
}

//DatabaeInterface.java

//databaseMeta会通过相应的数据源接口类DatabaseInterface的自己的查询sechema方法进行查询

//如果此方法没有被重写,那么就使用DatabaseMetaData自身的getSchemas()
default ResultSet getSchemas( DatabaseMetaData databaseMetaData, DatabaseMeta dbMeta ) throws SQLException {
  return databaseMetaData.getSchemas();
}

可以看到这里调用了jdk自带的DatabaseMetaData类

接着查看clickhouse自身的驱动包里的实现类,ClickhouseDatabaseMetaData.java

//ClickHouseDatabaseMetaData.java

@Override
public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException {
    //可以看到这里有有个判断逻辑,如果是未配置useSchema参数,则返回空的目录
    //这下恍然大迷糊,原来是jdbc中少了相关参数
    if (!connection.getJdbcConfig().useSchema()) {
        return empty("TABLE_SCHEM String, TABLE_CATALOG Nullable(String)");
    }

    Map<String, String> params = Collections.singletonMap("pattern",
            ClickHouseChecker.isNullOrEmpty(schemaPattern) ? "'%'"
                    : ClickHouseValues.convertToQuotedString(schemaPattern));
    ResultSet rs = query(ClickHouseParameterizedQuery.apply("select name as TABLE_SCHEM, null as TABLE_CATALOG "
            + "from system.databases where name like :pattern order by name", params));
    if (!connection.getJdbcConfig().isExternalDatabaseSupported()) {
        return rs;
    }

    return new CombinedResultSet(
            rs,
            query(ClickHouseParameterizedQuery.apply(
                    "select concat('jdbc(''', name, ''')') as TABLE_SCHEM, null as TABLE_CATALOG "
                            + "from jdbc('', 'SHOW DATASOURCES') where TABLE_SCHEM like :pattern order by name",
                    params), true));
}

源码改造方案

那么直接就在jdbc中追加该参数,验证一下:

@Override
public String getURL(String hostname, String port, String databaseName) throws KettleDatabaseException {
    if (getAccessType() == DatabaseMeta.TYPE_ACCESS_ODBC) {
        return "jdbc:odbc:" + databaseName;
    } else if (getAccessType() == DatabaseMeta.TYPE_ACCESS_NATIVE) {
        String _hostname = hostname;
        String _port = port;
        String _databaseName = databaseName;
        String _SocketTimeOut = "?socket_timeout=3600000&databaseTerm=schema";
        if (Utils.isEmpty(hostname)) {
            _hostname = "localhost";
        }
        if (Utils.isEmpty(port) || port.equals("-1")) {
            _port = "";
        }
        if (Utils.isEmpty(databaseName)) {
            throw new KettleDatabaseException("必须指定数据库名称");
        }
        if (!databaseName.startsWith("/")) {
            _databaseName = "/" + databaseName;
        }
        return "jdbc:clickhouse://" + _hostname + (Utils.isEmpty(_port) ? "" : ":" + _port) + _databaseName + _SocketTimeOut;
    } else {
        throw new KettleDatabaseException("不支持的数据库连接方式[" + getAccessType() + "]");
    }
}

打包测试

将项目打包:

部署插件包

将打包好的jar拷贝到kettle的目录下面:

拷贝到pdi-ce-9.4.0.0-343\data-integration\plugins路径下面,进行解压:

结构如上所示

验证功能

重启kettle,配置clickhouse数据源进行验证:

测试连接功能

测试查看数据目录功能

这个时候已经可以通过schema进行查看相关数据库信息了。

测试一下数据预览和表结构关系

测试一下DDL功能

测试查询性能

62万条数据读取,连续测试3次查询,性能维持在4w/s左右

测试插入性能

100w条数据,写入性能测试3次,平均速度在4000/s

插件包下载地址

链接: https://pan.baidu.com/s/1OvTznq14EYGVd2mEIYO3yA 提取码: 9xim 复制这段内容后打开百度网盘手机App,操作更方便哦

也可后台私信我获取源码,自行编译打包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/894697.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】string类(接口使用详解 下)

我们接着【C】string类&#xff08;接口使用详解 上&#xff09;-CSDN博客 继续介绍string的使用。 1.string类对象的修改操作 我们就说一下用的比较多的接口。 1.1 operator 这个接口可以尾插一个字符&#xff0c;或者一个字符串&#xff0c;或者一个对象。 string s1(&qu…

回归测试内容多,时间紧,人还少,怎么办?

问答网站上看到一个提问&#xff1a; 项目进入测试&#xff0c;但回归测试内容多&#xff0c;发布时间紧迫&#xff0c;人还少&#xff0c;要怎么做&#xff1f; 标准答案应该是自动化测试 回归测试主要关注的是历史功能&#xff0c;如果自动化测试覆盖率达到一定程度的话&…

lazyLoad

//1.通过React的lazy函数配合import()函数动态加载路由组件 > 路由组件代码会被分开打包 const Login lazy(()>import(/pages/Login)) //2.通过<Suspense>指定在加载得到路由打包文件前显示一个自定义loading界面 <Suspense fallback{<h1&…

探索Spring Cloud Config:构建高可用的配置中心

目录 认识Spring Cloud ConfigConfig Server读取配置文件步骤1&#xff1a;&#xff08;1&#xff09;创建config-server项目&#xff08;2&#xff09;在config-server中开启Config Server功能&#xff08;3&#xff09;在config-server配置文件进行相关配置&#xff08;4&…

计算机毕业设计Python深度学习房价预测 房源可视化 房源爬虫 二手房可视化 二手房爬虫 递归决策树模型 机器学习 深度学习 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 房地产是促进我国经济持续增…

征程 6E DISPLAY 功能介绍及上手实践

01 功能概述 本文将带大家一起实现单路、多路 MIPI CSI TX 输出、IDU 回写、IDU oneshot 模式、绑定输出 VPS 数据等功能&#xff0c;此处主要介绍各 sample 的实现与使用方法。 02 软件架构说明 本文中绑定 VPS 输出功能基于 libvio API 实现&#xff0c;调用 libvio 提供的…

Ubuntu16.04安装openssl库

Ubuntu16.04安装openssl库 Chapter1 Ubuntu16.04安装openssl库 Chapter1 Ubuntu16.04安装openssl库 原文链接&#xff1a;https://blog.csdn.net/weixin_36584476/article/details/107321893 记录一下省得忘了 1.首先去openssl官网下载源码www.openssl.org/source/&#xff0…

西瓜书书本内容杂谈

西瓜书书本内容杂谈 把圈子变小&#xff0c;把语速放缓&#xff0c;把心放宽&#xff0c;把生活打理好 只能说快速过了一遍&#xff0c;花了一个多星期吧&#xff0c;然后后边的内容是一点也看不懂了&#xff08;能发现前面记得比较详细&#xff0c;到了后边是看不懂一点了&a…

音视频基础知识分享

音视频基础知识分享 RKMedia的各个组件及其交互 首先上图&#xff1a; 考虑到公司业务主要是相机&#xff0c;所以&#xff0c;主要去关注图像数据流&#xff0c;对于音频数据流直接忽略。 图像数据流向&#xff1a; Camera Sensor将光信号转换成电信号&#xff08;Raw数据&…

基于语音识别的停车共享小程序(lw+演示+源码+运行)

目 录 1 绪论1 1.1 课题研究背景1 1.2 研究现状1 1.3 论文结构安排1 2 系统关键技术2 2.1 微信小程序2 2.2 微信Web开发者工具2 2.3 JavaScript简介2 2.4 微信小程序API接口2 2.5 MYSQL数据库2 3 系统分析1 3.1 可行性分析1 3.1.1 技术可行性1 3.1.2 经济可行性1…

如何查看公众号真实粉丝数,2024年还有哪些粉丝百万以上的大号?

如何查看公众号真实粉丝数&#xff1f;很简单&#xff0c;写了个脚本一键获取&#xff0c;看看2024年还有哪些粉丝百万以上的大号&#xff1f; 猫笔刀这个号2018-2024年的所有历史文章&#xff0c;共1168篇&#xff0c;导出的excel文章数据包含文章日期&#xff0c;文章标题&a…

bean的实例化2024年10月17日

跟不上为基础 1.你的java学习路线 2. 3.课程 注解的装配 contoller调用service用的是注解装配

【Linux】解答:为什么创建目录文件,硬链接数是2;创建普通文件时,硬链接数是1?(超详细图文)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

我在自动化测试方面犯过的3个大错误

每个人都会犯错误&#xff0c;但不管错误看起来有多糟糕&#xff0c;你都可以恢复过来&#xff0c;更重要的是&#xff0c;从错误中学习。 在软件开发过程的任何领域&#xff0c;从编码到测试&#xff0c;我们都会时不时地犯一些错误。通常&#xff0c;这些错误都很小&#xf…

从零开始学PHP之安装开发环境

前言 不整那些虚的&#xff0c;直接开始上干货&#xff0c;争取让小白也看得懂 环境选择 php开发环境一般分为集成环境和编译环境&#xff0c;由于编辑环境费时费力&#xff08;我没搞明白&#xff09;直接使用集成环境&#xff0c;市面上php的集成环境很多我这里用的是phps…

Java—类和对象习题讲解

如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 目录 习题一&#xff1a; 习题二&#xff1a; 习题三&#xff1a;.import static 能够导入一些静态方法 习题四&#xff1a; 习题五&#xff1a; 习题六&#xff1…

IDEA如何用maven打包(界面和命令两种方式)

前言 我们在使用IDEA开发时&#xff0c;如果是springboot项目的话&#xff0c;一般是用maven来管理我们的依赖的。然后&#xff0c;当我们开发完成之后&#xff0c;就需要打包部署了。 那么&#xff0c;我们应该如何打包呢&#xff1f; 如何打包&#xff08;jar包&#xff09…

智慧医疗,为健康护航

智能医院是一种利用先进的信息技术和智能设备&#xff0c;在提升医疗管理、服务水平和病人体验方面进行改造的现代化医疗机构。智能医院注重集成运维、智能照明和安全调度等关键方面&#xff0c;在医院运营和服务方面提供全方位的支持和保障。 集成运维是智慧医院的基石&#x…

C++初阶——入门

目录 1、C发展历史 2、C版本更新 3、C参考文档 4、C书籍推荐 5、C的程序 6、命名空间 6.1 namespace的作用 6.2 namespace的定义 6.3 namespace的使用 7、C输入&输出 8、缺省参数 9、函数重载 10、引用 10.1 引用的概念和定义 10.2 引用的特性 10.3 引用的使…

【网络原理】TCP/IP五层网络模型之网络层-----IP协议详解,建议收藏!!

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 前几篇文章中我们深入研究了TCP协议&#xff0c;因为TCP协议在我们日常开发中的使用频率非常高。而相比之下&#xff0c;IP协议与我们普通程序员关系就没那么近了。一般是专门开发…