Kettle9.4支持Clickhouse数据源插件开发以及性能测试
前言
最近业务这边有个指标需要用到大数据这边的列式数据库进行处理,由于kettle不支持clickhouse数据源驱动,这里查了一下网上的相关资料,发现了一些别人开发好的驱动包,下载下来后使用效果不尽人意。总结下来有以下几个问题:
-
不支持schema目录展示
-
生成的DDL语句无法执行,右键预览数据报错
-
查询数据出现错误
注意:低版本的kettle即使装ClickHouse驱动包后也不一定支持ClickHouse数据库连接(具体受clickhouse的驱动包编译版本限制,目前自己测试的最低支持到kettle 7.1),只有高版本的kettle在安装ClickHouse驱动包后才支持ClickHouse数据库连接,因此这里使用的时比较稳定的9.4.0版本。
源码分析
综上所述,我基于上述问题进行了驱动包的改造,首先是无非基于schema进行层级预览,导致很多表都混合在一起,不方便查看,这里我研究了一下kettle的源码:
//DatabaseMeta.javapublic 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 listwhile ( 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,操作更方便哦
也可后台私信我获取源码,自行编译打包。
相关文章:
Kettle9.4支持Clickhouse数据源插件开发以及性能测试
前言 最近业务这边有个指标需要用到大数据这边的列式数据库进行处理,由于kettle不支持clickhouse数据源驱动,这里查了一下网上的相关资料,发现了一些别人开发好的驱动包,下载下来后使用效果不尽人意。总结下来有以下几个问题&…...
微信支付V3 yansongda/pay 踩坑记录
Pay - 让支付开发更简单 | Pay 使用laravel 8框架 2.1 报错 Parse [mch_public_cert_path] Serial Number Error 是mch_secret_cert,mch_public_cert_path配置错误 2.2 报错 Get Wechat Public Cert Error 是mch_secret_key配置错误 #正确 Pay::config(config(w…...
AndroidStudio实验报告——实验一、二
目录 实验一: AS安装与安卓环境搭建 一、实验目标 二、实验内容 (一)Android Studio安装 (二)JDK安装与配置 (三)Android SDK安装与配置 三、实验结果:(实…...
Nginx超简洁知识:负载均衡-反向代理,动静分离,配置文件
首先介绍一下为什么需要nginx? 在低并发场景下(也就是用户量特别少的情况下),我们只需要部署一台服务器就能满足用户数量少的需求。 但是如果用户量逐渐增多,只有一台服务器是不够的。于是我们需要部署多台服务器。 …...
云手机:社交平台运营的热门工具
随着互联网的飞速发展,社交平台已经成为企业推广和营销的核心渠道。传统的运营方式已经无法满足高效运营的需求,而云手机作为新兴工具,逐渐成为社交平台运营的前沿趋势。本文将深入分析云手机如何优化社交平台的运营流程,助力企业…...
iptables限速规则
环境: iptables服务器:172.16.12.33 client:192.168.1.2 1、在防火墙上配置客户端的下载速度是1M/s (1个包是1.3KB) #限速客户端每秒的下载速度是1024KB,超出限制的流量就丢弃 [rootiptables-172-16-12-…...
易泊车牌识别:海外车牌快速定制,开启智能识别新时代
在当今数字化快速发展的时代,车牌识别技术已经成为了智能交通系统中不可或缺的一部分。而在众多车牌识别解决方案中,易泊车牌识别系统以其卓越的性能和独特的优势脱颖而出,尤其是在海外车牌快速定制方面,更是展现出了强大的实力。…...
同一个交换机不同vlan的设备为什么不能通信
在同一个交换机上,不同 VLAN 的设备不能直接通信,这是因为 VLAN(虚拟局域网)通过在数据链路层(OSI 第2层)对设备进行逻辑隔离,将不同 VLAN 的设备视为属于不同的网络。具体原因如下:…...
《业务三板斧:定目标、抓过程、拿结果》读书笔记4
管理者抓技能的第二个动作是构地图 管理者如何构建能力地图? 梳流程 构建能力地图的关键是梳理业务流程,明确“要做什么”及“怎么 做”。管理者只有明晰每一项业务流程对应的策略、关键举措、风 险、工具、话术、案例等,才能将方法复制给每一…...
PRCV 2024 - Day2
主会场 —— 主旨报告 报告题目:大模型背景下的数字内容取证 讲者:谭铁牛(中科院自动化所,中国科学院院士) 图1 大模型背景下的数字内容取证 在数字化时代,随着人工智能技术的迅猛发展,尤其是深度学习的广泛应用&…...
大厂面试真题-了解云原生吗,简单说一下docker和k8s
K8s(Kubernetes)和Docker都是容器化技术中的关键组件,但它们各自扮演着不同的角色。以下是对这两者的详细解析: 一、Docker Docker是一个开源的容器化平台,它允许开发人员将应用程序及其依赖项打包为一个独立的镜像&…...
Python基础入门
目录 1. 简介 2. 安装与设置 2.1 检查是否已安装Python 2.2 使用Python解释器 2.3 使用代码编辑器 3. Python基础语法 3.1 注释 3.2 变量和数据类型 3.3 输入输出 3.4 基本运算 4. 条件语句与循环 4.1 条件判断 4.2 循环 while循环 for循环 break与continue 5.…...
深入了解路由
目录 1. 什么是路由?2. 路由与网关的关系3. 路由表4. 静态路由与动态路由5. 下一跳6. 动态路由及常用路由协议7. 路由算法解析 1. 什么是路由? 路由 是网络中将数据包从源地址传送到目标地址的过程。它涉及网络设备(如路由器)根据…...
三大编程思想(POP、OOP、AOP、FOP)及oop 五大设计原则
概述 POP:面向过程编程(Procedure Oriented Programming) OOP:面向对象编程(Object Oriented Programming) AOP:面向切面编程(Aspect Oriented Programming) FOP&#x…...
JavaWeb开发4
JS对象 Array Array对象用于定义数组 var 变量名new Array(元素列表); var 变量名[元素列表] 访问 arr[索引]值; 注意:JS中数组相对于Java中集合,数组的长度是可变的,JS是弱类型,所以可以存储任意类型…...
Git中Update和Pull的区别
在本文中,我们将介绍Git中的两个操作——”Update”和”Pull”,并解释它们之间的区别。 1、“Update”的含义和用法 “Update”是Git中用于更新本地仓库和工作区的操作。它的作用是将远程仓库中的最新变更同步到本地。当我们执行”Update”操作时&…...
物理安全概述
目录 物理安全概念物理安全威胁物理安全威胁物理安全保护物理安全分析与防护 物理安全概念 我不需要通过高深的网络技术来攻击你,直接在物理层面把你干倒,不要小瞧,其实这种攻击是最致命的,你把我的电脑给入侵了,可能…...
引领智慧文旅新纪元,开启未来旅游新境界
融合创新科技,重塑旅游体验,智慧文旅项目定义旅游新未来 在全球化的浪潮中,旅游已成为连接世界的重要纽带。智慧文旅项目,不仅仅是一次技术的革新,更是对旅游行业未来发展的一次深刻思考。信鸥科技通过运用云计算、大数…...
Qt开发技巧(十七):新窗口控件用智能指针,将一些配置类变量封装起来,Qt窗体的Z序叠放,子窗体的释放,Qt中的事件发送,Qt的全局头文件
继续讲一些Qt开发中的技巧操作: 1.新窗口控件用智能指针 通过对Qt自带Examples的源码研究你会发现,越往后的版本,越喜欢用智能指针QScopedPointer来定义对象,这样有个好处就是用的地方只管new就行,一直new下去…...
5G 现网信令参数学习(1) - MIB
MIB消息中的参数 systemFrameNumber 000101B, subCarrierSpacingCommon scs30or120, ssb-SubcarrierOffset 6, dmrs-TypeA-Position pos2, pdcch-ConfigSIB1 { controlResourceSetZero 10, searchSpaceZero 4 }, cellBarred notBarred, intraFreqReselection allowed, sp…...
深入FreeRTOS SMP调度器:主核与从核如何“默契配合”完成第一次任务切换?
深入FreeRTOS SMP调度器:主核与从核如何“默契配合”完成第一次任务切换? 在嵌入式系统开发中,实时操作系统(RTOS)的多核支持已成为提升性能的关键。FreeRTOS作为业界广泛采用的RTOS,其SMP(对称…...
Fish Speech-1.5中文语音惊艳案例:古诗词吟诵/方言童谣/戏曲念白生成
Fish Speech-1.5中文语音惊艳案例:古诗词吟诵/方言童谣/戏曲念白生成 你听过AI用抑扬顿挫的语调吟诵唐诗宋词吗?你听过AI用地道的方言念出童年歌谣吗?你听过AI模仿戏曲念白,字正腔圆、韵味十足吗? 今天,我…...
解码AMD EPYC CPU命名规则:从数字到性能的全面解析
1. AMD EPYC CPU命名规则入门指南 第一次看到AMD EPYC处理器的型号时,我完全被那一串数字字母搞懵了。EPYC 7763、EPYC 75F3、EPYC 7313P...这些看似随机的组合其实藏着重要信息。就像汽车型号能看出排量和配置一样,EPYC的命名规则也能让我们快速判断处理…...
别再乱传props了!UniApp项目里用Vuex管理用户登录和购物车状态,保姆级配置流程
UniApp实战:用Vuex重构用户登录与购物车状态管理 每次看到项目里十几个组件层层传递props,我都忍不住想吐槽——这简直就像用快递员接力运送同一份外卖!特别是在处理用户登录状态和购物车数据时,这种"击鼓传花"式的状态…...
Lixie数码管驱动库深度解析:WS2812B嵌入式显示控制实践
1. Lixie 数码管驱动库技术解析:面向嵌入式工程师的深度实践指南Lixie 是一款专为驱动“Lixie 边缘导光数码管”(Edge-Lit Digit Display)设计的 Arduino 兼容库。它并非传统真空管或七段 LED,而是一种融合光学设计与现代 LED 控制…...
解决Vivado中FDCP时序警告的实战技巧
1. 理解FDCP时序警告的本质 在Vivado开发过程中遇到FDCP时序警告时,很多开发者第一反应是"这又是个莫名其妙的警告"。但根据我处理过的二十多个类似案例,这个警告其实是个非常负责的"哨兵",它在提醒你电路可能存在严重的…...
ESP32S3变身HID设备:用esp-iot-solution实现USB键盘鼠标(附常见编译错误修复)
ESP32S3实战:基于esp-iot-solution打造高响应USB HID设备的全流程指南 当ESP32S3遇上USB HID协议,开发者手中的这块开发板瞬间化身为键盘鼠标模拟利器。不同于市面上简单的教程,本文将带您深入esp-iot-solution框架的核心,从环境搭…...
龙芯k - 走马观碑组MPU驱动移植霸
先回顾:三次握手(建立连接)核心流程(实际版) 为了让挥手流程衔接更顺畅,咱们先快速回顾三次握手的实际核心,避免上下文脱节: 第一步(客户端→服务器)…...
Debian根文件系统定制:从零构建到实战优化
1. Debian根文件系统入门指南 第一次听说"根文件系统"这个概念时,我也是一头雾水。简单来说,它就像是你电脑的操作系统"骨架"——包含了启动、运行和管理系统所需的所有核心文件和目录。想象一下盖房子,根文件系统就是地…...
微软发布的《生成式人工智能初学者.NET 第二版》课程浇
本课概览 Microsoft Agent Framework (MAF) 提供了一套强大的 Workflow(工作流) 框架,用于编排和协调多个智能体(Agent)或处理组件的执行流程。 本课将以通俗易懂的方式,帮助你理解 MAF Workflow 的核心概念…...
