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,操作更方便哦

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

quic-go源码一---server启动

前言&#xff1a; 走马观花地看了RFC 9000:QUIC: A UDP-Based Multiplexed and Secure Transport&#xff0c; 感受不是那么直观&#xff0c;所以再来看看这个协议的golang语言实现&#xff1a;quic-go,加强学习。 https://quic-go.net/docs/quic/quic-go文档 本篇准备的代…

基于R语言机器学习方法在生态经济学领域中技术应用

近年来&#xff0c;人工智能领域已经取得突破性进展&#xff0c;对经济社会各个领域都产生了重大影响&#xff0c;结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一&#xff0c;目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…

证件照小程序源码,前后端稳定运行

演示&#xff1a;证寸照制作 运行环境: Linux Nginx PHP >5.6 MySQL>5.6 安装步骤: 1.下载源码上传至你的服务器宝塔面板 2.直接添加站点选择源码目录&#xff0c;新建数据库 3.设置代码执行目录为/web 4.在浏览器中输入你的域名&#xff0c;会提示安装&#xff0c;填写…

SpringBoot02:第一个springboot程序

3、第一个springboot程序 3.1、准备工作 我们将学习如何快速的创建一个Spring Boot应用&#xff0c;并且实现一个简单的Http请求处理。通过这个例子对Spring Boot有一个初步的了解&#xff0c;并体验其结构简单、开发快速的特性。 我的环境准备&#xff1a; java version "…

智能优化算法-禁忌搜索算法(TS)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 禁忌搜索优化算法 (Tabu Search, TS) 是一种基于局部搜索的元启发式优化算法&#xff0c;由Fred Glover于1986年提出。TS通过引入“禁忌表”来避免重复搜索已经访问过的解&#xff0c;从而跳出局部最优解&#…

十四、MySQL事务日志

文章目录 1. redo日志1.1 为什么需要REDO日志1.2 REDO日志的好处、特点1.2.1 好处1.2.2 特点1.3 redo的组成1.4 redo的整体流程1.5 redo log 的刷盘策略1.6 不同刷盘策略演示1.7 写入redo log buffer 过程1.7.1 补充概念:Mini-Transaction1.7.2 redo 日志写入log buffer1.7.3 …

[DB] NSM

Database Workloads&#xff08;数据库工作负载&#xff09; 数据库工作负载指的是数据库在执行不同类型任务时所需的资源和计算方式&#xff0c;主要包括以下几种类型&#xff1a; 1. On-Line Transaction Processing (OLTP) 中文&#xff1a;联机事务处理解释&#xff1a;…

如何使用DockerSpy检测你的Docker镜像是否安全

关于DockerSpy DockerSpy是一款针对Docker镜像的敏感信息检测与安全审计工具&#xff0c;该工具可以帮助广大研究人员在Docker Hub上检测和搜索自己镜像的安全问题&#xff0c;并识别潜在的泄漏内容&#xff0c;例如身份验证密钥等敏感信息。 功能介绍 1、安全审计&#xff1a…

基于yolov10的驾驶员抽烟打电话安全带检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv10的驾驶员抽烟、打电话、安全带检测系统是一种先进的驾驶行为监测系统。该系统利用YOLOv10算法的高效性和准确性&#xff0c;实现对驾驶员行为的实时检测与识别。 YOLOv10是一种最新的实时物体检测模型&#xff0c;其通过深度学习技术&#xff0c;如卷…

【网络原理】HTTP协议

目录 前言 一.什么是HTTP HTTP报文格式 HTTP的请求格式 1.首行 2.请求头&#xff08;header&#xff09; 3.空行 4.正文&#xff08;body&#xff09; HTTP的响应格式 1.首行 2.响应头 3.空行 4.正文&#xff08;body&#xff09; 首行中的方法 GET和POST的区别 …

使用Radzen Blazor组件库开发的基于ABP框架炫酷UI主题

一、项目简介 使用过ABP框架的童鞋应该知道它也自带了一款免费的Blazor UI主题&#xff0c;它的页面是长这样的&#xff1a; 个人感觉不太美观&#xff0c;于是网上搜了很多Blazor开源组件库&#xff0c;发现有一款样式非常不错的组件库&#xff0c;名叫&#xff1a;Radzen&am…

[渗透]前端源码Chrome浏览器修改并运行

文章目录 简述本项目所使用的代码[Fir](https://so.csdn.net/so/search?qFir&spm1001.2101.3001.7020) Cloud 完整项目 原始页面修改源码本地运行前端源码修改页面布局修改请求接口 本项目请求方式 简述 好久之前&#xff0c;就已经看到&#xff0c;_无论什么样的加密&am…

【p2p、分布式,区块链笔记 Blockchain】truffle004 测试网络项目部署

编写合约 一个简单的Solidity智能合约 Usermap 用于在以太坊区块链上管理用户的ID和名称&#xff1a; 数据存储: 使用了 mapping 和 array 两种方式存储用户信息。addUser: 添加用户&#xff08;id和对应的用户名name&#xff09;到区块链。getid: 根据用户 id 获取用户名。该函…

计算机组成原理一句话

文章目录 计算机系统概述存储系统 计算机系统概述 指令和数据以同等地位存储在存储器中&#xff0c;形式上没有差别&#xff0c;但计算机应能区分他们。通过指令周期的不同阶段。 完整的计算机系统包括&#xff0c;1&#xff09;软件系统&#xff1a;程序、文档和数据&#xff…

【牛客刷题】笔记2

目录 1、单词搜索 2、岛屿数量 2.1 DFS 2.2 BFS 3、腐烂的橘子 1、单词搜索 单词搜索_牛客题霸_牛客网 (nowcoder.com) 这道题我们就是先遍历数组board&#xff0c;若遇到了与word[0]相等的字符&#xff0c;则以这个字符为起点进行搜索&#xff0c;搜索可以是dfs&#x…

PHP露营地管理小程序系统源码

&#x1f3d5;️露营新风尚&#xff01;露营地管理小程序系统&#xff0c;打造完美露营体验✨ &#x1f4cd;营地预订&#xff0c;轻松搞定&#x1f4c5; 想要逃离城市的喧嚣&#xff0c;享受大自然的宁静&#xff1f;露营地管理小程序系统让你的露营计划轻松实现&#xff01…

判断网站需不需要改版的几个要点

判断一个网站是否需要改版&#xff0c;可以从多个维度进行分析。以下是一些关键要点&#xff1a; 用户体验&#xff1a; 访问速度&#xff1a;如果网站加载缓慢&#xff0c;用户可能会感到沮丧并离开。导航性&#xff1a;网站结构是否清晰&#xff0c;用户是否能够轻松找到所需…

WebGL编程指南 - 绘制和变换三角形

三角形在三维图形学中的重要地位&#xff0c;以及WebGL如何绘制三角形。使用多个三角形绘制其它类型的基本图形。利用简单的方程对三角形做基本的变换&#xff0c;如移动、旋转和缩放。利用矩阵简化变换。 绘制多个点与缓冲区对象 相关内容&#xff1a;缓冲区对象&#xff1a;创…

第J6周:ResNeXt-50实战解析(pytorch版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** 任务&#xff1a; ●阅读ResNeXt论文&#xff0c;了解作者的构建思路 ●对比我们之前介绍的ResNet50V2、DenseNet算法 ●使用ResNeX…

LabVIEW离心泵振动监控与诊断系统

利用LabVIEW结合数据采集与处理技术&#xff0c;构建了一套高效、低成本的振动监测与诊断系统&#xff0c;有效提升了测试精度与设备可靠性。 项目背景 在化工生产中&#xff0c;离心泵作为关键设备&#xff0c;其稳定运行对保障生产安全与效率至关重要。由于传统振动测试系统…