Spring Boot 集成 Kettle

Kettle 简介

Kettle 最初由 Matt Casters 开发,是 Pentaho 数据集成平台的一部分。它提供了一个用户友好的界面和丰富的功能集,使用户能够轻松地设计、执行和监控 ETL 任务。Kettle 通过其强大的功能和灵活性,帮助企业高效地处理大规模数据集成任务。

主要组成部分
  1. Spoon
    • 用途:Spoon 是 Kettle 的图形化设计工具。用户可以使用 Spoon 设计和调试 ETL 转换和作业。
    • 功能:拖放式界面、预览数据、测试 ETL 流程、管理连接、编写脚本等。
  2. Pan
    • 用途:Pan 是一个命令行工具,用于执行由 Spoon 设计的 ETL 转换。
    • 功能:通过命令行执行转换、调度作业、集成到其他自动化流程中。
  3. Kitchen
    • 用途:Kitchen 是一个命令行工具,用于执行由 Spoon 设计的 ETL 作业。
    • 功能:通过命令行执行作业、调度作业、集成到其他自动化流程中。
  4. Carte
    • 用途:Carte 是一个轻量级的 Web 服务器,提供远程执行和监控功能。
    • 功能:远程执行和监控 ETL 转换和作业、查看日志、管理集群等。
  5. Repositories
    • 用途:存储和管理 ETL 转换和作业的地方。
    • 功能:可以使用数据库或文件系统作为存储库,支持版本控制和共享。
主要功能和特点
  1. 数据提取

    • 支持多种数据源,如关系数据库、文件(CSV、Excel、XML 等)、大数据平台(Hadoop、Hive 等)、云存储(Amazon S3、Google Drive 等)、Web 服务和 API 等。
  2. 数据转换

    • 丰富的转换步骤,包括数据清洗、数据聚合、数据过滤、数据排序、数据连接、数据拆分、数据类型转换等。
  3. 数据加载

    • 支持将数据加载到多种目标系统中,如关系数据库、大数据平台、文件系统、云存储等。
  4. 调度和自动化

    • 支持通过命令行工具(Pan 和 Kitchen)和调度器(如 cron 或 Windows 任务计划)进行调度和自动化执行。
  5. 扩展性

    • 提供了插件机制,用户可以编写自定义插件,扩展 Kettle 的功能。
    • 支持 JavaScript 和 Java 进行脚本编写,增强转换和作业的灵活性。
  6. 集群和并行处理

    • 支持集群模式,能够在分布式环境中并行处理大规模数据。
    • 提供了分布式 ETL 执行和负载均衡功能。
  7. 数据质量和数据治理

    • 提供了数据验证、数据一致性检查和数据校验功能,帮助确保数据的质量和一致性。
  8. 实时数据处理

    • 支持实时数据流处理,通过集成 Kafka、MQTT 等流处理平台,实现实时数据的提取、转换和加载。

集成 Kettle

将 Kettle(Pentaho Data Integration, PDI)集成到 Spring Boot 项目中,可以实现 ETL 流程的自动化和集成化处理。以下是详细的集成过程:

准备工作
  1. 下载 Kettle:从 Pentaho 官网下载 Kettle(PDI)的最新版本,并解压到本地目录。
  2. Spring Boot 项目:确保已有一个 Spring Boot 项目,或新建一个 Spring Boot 项目。
引入 Kettle 依赖

在 Spring Boot 项目的 pom.xml 文件中添加 Kettle 所需的依赖。你可以将 Kettle 的 JAR 文件添加到本地 Maven 仓库,或直接在项目中引入这些 JAR 文件。

<dependencies><!-- Spring Boot 依赖 --><!-- Kettle 依赖 --><dependency><groupId>pentaho-kettle</groupId><artifactId>kettle-core</artifactId><version>9.4.0.0-343</version></dependency><dependency><groupId>pentaho-kettle</groupId><artifactId>kettle-engine</artifactId><version>9.4.0.0-343</version></dependency><dependency><groupId>pentaho-kettle</groupId><artifactId>kettle-dbdialog</artifactId><version>9.4.0.0-343</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-vfs2</artifactId><version>2.7.0</version></dependency><!-- 根据需要添加其他 Kettle 依赖 --><!-- 操作数据库数据时添加相应的数据库依赖 --></dependencies>
处理密码加密

resources 目录下创建 kettle-password-encoder-plugins.xml 文件,用于配置密码加密插件:

<password-encoder-plugins><password-encoder-plugin id="Kettle"><description>Kettle Password Encoder</description><classname>org.pentaho.support.encryption.KettleTwoWayPasswordEncoder</classname></password-encoder-plugin></password-encoder-plugins>

kettle-core依赖中org.pentaho.support.encryption.KettleTwoWayPasswordEncoder类实现了TwoWayPasswordEncoderInterface接口,用于处理密码的加密和解密操作。

添加 Spoon 的任务文件

在 Kettle(Pentaho Data Integration,PDI)中,作业(Job)和转换(Transformation)是两种核心的 ETL 组件,它们在设计和功能上有着本质的区别。

转换(Transformation)
  1. 数据处理流程:转换是一个数据处理流程,专注于数据的提取(Extract)、转换(Transform)和加载(Load)。
  2. 行级处理:转换以行级处理数据,每次处理一行数据,并将其传递给下一步骤。
  3. 任务文件为.ktr文件。
作业(Job)
  1. 任务管理和控制流程:作业是一个任务管理和控制流程,负责调度和控制一系列任务的执行顺序。
  2. 步骤级处理:作业以步骤为单位处理任务,每次执行一个步骤,然后根据条件决定执行下一个步骤。
  3. 任务文件为.kjb文件。
区别
  1. 转换处理数据行,作业处理任务步骤。
  2. 转换中的步骤是并行执行的,而作业中的步骤是顺序执行的。
  3. 转换侧重于数据的处理和转换,作业侧重于任务的调度和管理。
  4. 转换主要通过数据流控制,作业提供了丰富的逻辑控制(条件判断、循环、错误处理等)。
  5. 转换适用于复杂的数据处理流程,作业适用于任务调度和控制。

在 Spring Boot 项目的 resources 目录下,创建一个 kettle 目录,并将 Kettle 的任务文件(如 转换1.ktr)复制到该目录中。

编写 Kettle 服务类

创建一个服务类,用于执行 Kettle 转换或作业。

package com.example.kettletest.service.impl;import com.example.kettletest.service.KettleJobService;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.util.EnvUtil;
import org.pentaho.di.job.Job;
import org.pentaho.di.job.JobMeta;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;import java.io.File;
import java.io.IOException;/*** @author 罗森* @date 2024/6/6 13:21*/
@Service
public class KettleJobServiceImpl implements KettleJobService {@Overridepublic void runTaskFile(String taskFileName) {// 初始化 Kettle 环境try {KettleEnvironment.init();EnvUtil.environmentInit();} catch (KettleException e) {throw new RuntimeException(e);}// 执行任务文件if (taskFileName.endsWith(".ktr")) {taskFileKTR(taskFileName);} else if (taskFileName.endsWith(".kjb")) {taskFileKJB(taskFileName);} else {throw new IllegalArgumentException("Unsupported file type: " + taskFileName);}}/*** 针对kjb文件的操作* @param taskFileName*/public void taskFileKJB(String taskFileName) {try {// 获取资源文件路径ClassPathResource resource = new ClassPathResource("kettle/" + taskFileName);File jobFile = resource.getFile();// 加载 KJB 文件JobMeta jobMeta = new JobMeta(jobFile.getAbsolutePath(), null);// 创建作业对象Job job = new Job(null, jobMeta);// 启动作业job.start();// 等待作业完成job.waitUntilFinished();if (job.getErrors() > 0) {System.out.println("There were errors during job execution.");} else {System.out.println("Job executed successfully.");}} catch (IOException | KettleXMLException e) {e.printStackTrace();}}/*** 针对ktr文件的操作* @param taskFileName*/public void taskFileKTR(String taskFileName) {try {// 获取资源文件路径ClassPathResource resource = new ClassPathResource("kettle/" + taskFileName);File transFile = resource.getFile();// 加载 KTR 文件TransMeta transMeta = new TransMeta(transFile.getAbsolutePath());// 创建转换对象Trans trans = new Trans(transMeta);// 启动作业trans.execute(null);// 等待作业完成trans.waitUntilFinished();if (trans.getErrors() > 0) {System.err.println("There were errors during Transformation execution.");} else {System.out.println("Transformation executed successfully!");}} catch (IOException | KettleException e) {e.printStackTrace();}}
}

常见问题解决办法

  1. 运行后报错信息为:Unable to find plugin with ID 'Kettle'. If this is a test, make sure kettle-core tests jar is a dependency. If this is live make sure a kettle-password-encoder-plugins.xml exits in the classpath.

    **解决办法:**在 resources 目录下创建 kettle-password-encoder-plugins.xml 文件。

  2. 运行后报错信息为:ERROR (version 9.4.0.0-343, build 0.0 from 2022-11-08 07.50.27 by buildguy) : A serious error occurred during job execution: 无法找到作业的开始点.

    **解决办法:**为Spoon制作的作业任务增加开始节点。

  3. 运行后报错信息为:Can't run transformation due to plugin missing.

    **解决办法:**此问题通常出现在涉及类似于导出excel文件、json文件时。在初始化 Kettle 环境之前指明相关插件的绝对路径(相关插件通常在Kettle本地解压文件夹中的plugins目录下),新增以下代码:

    StepPluginType.getInstance().getPluginFolders().add(new PluginFolder("E:\\Kettle\\pdi-ce-9.4.0.0-343\\data-integration\\plugins", false, true));
    

    将代码中的地址换成您本地的绝对地址。


(END)
by luosen.

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

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

相关文章

自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

CentOS8 启动错误,enter emergency mode ,开机直接进入紧急救援模式,报错 Failed to mount /home 解决方法

先看现场问题截图&#xff1a; 1.根据提示 按 ctrld 输入 root 密码&#xff0c;进入系统。 2. 在紧急模式下运行&#xff1a;journalctl -xe &#xff0c;查看相关日志&#xff0c;找到关键点&#xff1a; Failed to mount /home 3.接着执行修复命令&#xff1a; xfs_repa…

Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化教…

借助 Pause 容器调试 Pod

借助 Pause 容器调试 Pod 在 K8S 中&#xff0c;Pod 是最核心、最基础的资源对象&#xff0c;也是 Kubernetes 中调度最小单元。在介绍 Pause 容器之前需要先说明下 Pod 与容器的关系来理解为什么需要 Pause 容器来帮助调试 1. Pod 与 容器的关系 Pod 是一个抽象的逻辑概念&…

IDEA自定义文件打开格式

介绍在IDEA中自定义文件打开格式的方法&#xff0c;比如一个文件&#xff0c;可以选择用txt格式打开&#xff0c;也可以选择用xml格式打开&#xff0c;也可以用java格式打开等等&#xff0c;通过这个方法可以方便的用任意格式在idea中打开想要打开的文件。 下面分别讨论三种不…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略&#xff0c;由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护&#xff0c;特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程&#xff0c;使得团队成员可以更有效…

ECG心电前级信号提取

由于ECG信号很微弱&#xff0c;处于mV级别&#xff0c;还有很多干扰信号&#xff0c;所以采集信号时需要进行滤波和放大处理&#xff0c;然后使用模数转换。为了滤波高频干扰和工频噪声&#xff0c;需要使用低通滤波器和陷波器抑制噪声&#xff0c;有时也要使用高通滤波器滤除低…

【Android】逆向开发与反逆向开发入门知识(一)

目录 逆向开发反编译 & 反混淆反编译工具反编译反混淆 修改预置资源文件抓包前期准备二次打包重签名 如何预防 App 被逆向开发&#xff1f;代码混淆应用加固防止动态调试Root 检测二次打包检测 警告&#xff1a;逆向开发相关知识请在法律规定范围内使用&#xff0c;请勿使用…

华为Mate 70临近上市:代理IP与抢购攻略

随着科技的飞速发展&#xff0c;智能手机已经成为我们日常生活中不可或缺的一部分。而在众多智能手机品牌中&#xff0c;华为一直以其卓越的技术和创新力引领着行业的发展。近日&#xff0c;华为Mate 70系列手机的发布会正式定档在11月26日&#xff0c;这一消息引发了众多科技爱…

【Linux之权限】理论篇

前言 Linux的权限是我们学习Linux初期非常重要的基础知识&#xff0c;接下来我将通过一个系列【Linux之权限】&#xff0c;共三篇文章&#xff0c;对此进行较为全面和详细的解说。 sudo 情况&#xff1a;如果我们不是超级管理员&#xff0c;但是想执行一个权限级别比较高的指…

[C++] 智能指针

文章目录 智能指针的使用原因及场景分析为什么需要智能指针&#xff1f;异常抛出导致的资源泄漏问题分析 智能指针与RAIIC常用智能指针 使用智能指针优化代码优化后的代码优化点分析 析构函数中的异常问题解决方法 RAII 和智能指针的设计思路详解什么是 RAII&#xff1f;RAII 的…

spark性能优化调优指导性文件

1.让我们看一下前面的核心参数设置&#xff1a; num-executors10||20&#xff0c;executor-cores1||2&#xff0c;executor-memory10||20&#xff0c;driver-memory20&#xff0c;spark.default.parallelism64 假设我们的火花队列资源如下&#xff1a; 内存1T&#xff0c;内…

视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析

EasyPlayer.js RTSP播放器属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0…

零售项目管理的核心问题:如何让协作更高效?

在零售行业&#xff0c;团队协作的效率直接影响到市场反应速度和客户满意度。商品的上下架、库存管理、促销活动的策划与执行、跨部门的沟通与协作……每一个环节都需要精准的协调。而在这些纷繁复杂的任务中&#xff0c;项目管理软件正成为零售行业的关键工具&#xff0c;帮助…

用appinventor制作艾宾浩斯遗忘曲线app

&#xff08;呕心沥血 仅供参考&#xff09; 测试效果演示 用appinventor制作课本记背应用程序&#xff08;基于遗忘曲线设计&#xff09; 目录 效果演示 项目重难点 总体设计 系统功能模块设计 总体结构如下图所示&#xff1a; 功能模块 详细设计与实现 登录界面 界…

【设计模式】行为型模式(三):责任链模式、状态模式

行为型模式&#xff08;三&#xff09;&#xff1a;责任链模式、状态模式 5.责任链模式&#xff08;Chain of Responsibility&#xff09;5.1 通俗易懂的解释5.2 具体步骤5.3 代码示例5.3.1 处理者接口5.3.2 具体处理者5.3.3 测试类5.3.4 输出 5.4 总结 6.状态模式&#xff08;…

CC3学习记录

&#x1f338; CC3 之前学习到的cc1和cc6都是通过Runtime进行命令执行的&#xff0c;如果Runtime被加入黑名单的话&#xff0c;整个链子也就失效了。而cc3则是通过动态类加载机制进行任意代码执行的。 &#x1f338; 版本限制 JDK版本&#xff1a;8u65 Commons-Collections…

flutter字体大小切换案例 小字体,标准字体,大字体,超大字体案例

flutter字体大小切换案例 小字体&#xff0c;标准字体&#xff0c;大字体&#xff0c;超大字体案例 Android iOS设备带有选择记录 我的flutter项目版本 environment: sdk: ‘>3.4.4 <4.0.0’ 图片案例 pubspec.yaml 添加依赖 # 屏幕尺寸适配 https://github.com/OpenF…

设计模式(四)装饰器模式与命令模式

一、装饰器模式 1、意图 动态增加功能&#xff0c;相比于继承更加灵活 2、类图 Component(VisualComponent)&#xff1a;定义一个对象接口&#xff0c;可以给这些对象动态地添加职责。ConcreteComponent(TextView)&#xff1a;定义一个对象&#xff0c;可以给这个对象添加一…

django入门【05】模型介绍(二)——字段选项

文章目录 1、null 和 blank示例说明⭐ null 和 blank 结合使用的几种情况总结&#xff1a; 2、choices**choices 在 Django 中有以下几种形式&#xff1a;**&#xff08;1&#xff09; **简单的列表或元组形式**&#xff08;2&#xff09; **字典映射形式**&#xff08;3&#…