比 Kettle 快2倍的 Java ETL 开源库:Etl-engine

最近在Github上发现了一个不错的开源项目,基于Java的ETL开发库,号称表数据导入速度是kettle的2倍,而且简单易用,推荐一波:add2ws/etl-engine-project: A fast & stable & flexible ETL tool.

🚀 项目简介

Etl-engine 是一个轻量、稳健、易扩展的面向开发者的 ETL(抽取、转换、加载)库,旨在成为 **Kettle (PDI) 的高性能替代方案。


🔥 核心优势

Etl-engine 提供以下三大核心特性:

1. 极致的速度 ⚡️

通过批量操作和非阻塞的缓存管道设计,显著提升数据处理和数据库 I/O 速度。

📊 实测数据: 处理 <math xmlns="http://www.w3.org/1998/Math/MathML"> 200 , 000 200,000 </math>200,000 条数据的插入/更新任务,etl-engine 的速度是 Kettle 的 <math xmlns="http://www.w3.org/1998/Math/MathML"> 2 \mathbf{2} </math>2 倍左右

Kettle:

Etl-engine:

2. 运行稳健可靠 🛡️

数据流传输过程中如果遇到异常不会马上停止,自动尝试重新读取或写入数据。

3. 轻量且易于扩展 🧩

核心仅由 Node(节点) , Pipe(管道) , Dataflow(数据流) 3个主要组件构成,所有数据加载逻辑都抽象为可扩展的节点。除了内置的JDBC数据源节点,用户可以轻松继承基类,快速开发新的数据源(如 Http、Redis)或自定义转换逻辑,满足特定的业务需求。


🛠️ 使用示例

以下代码展示了如何快速构建一个将 Oracle 数据(抽取) 通过 Upsert 方式同步到 PostgreSQL(加载) 的 ETL 任务。

1. 一个表输入到一个表输出

flowchart LR sqlInputNode --pipe--> upsertOutputNode
java 复制代码
//创建Oracle数据源
DataSource dataSourceOracle = DataSourceUtil.getOracleDataSource();
//创建表输入节点
SqlInputNode sqlInputNode = new SqlInputNode(dataSourceOracle, "select * from t_resident_info");

//创建Postgres数据源
DataSource dataSourcePG = DataSourceUtil.getPostgresDataSource();
//创建插入/更新节点
UpsertOutputNode upsertOutputNode = new UpsertOutputNode(dataSourcePG, "t_resident_info", 1000);
//设置唯一标识(主键)映射,用于判断 Insert 或 Update
upsertOutputNode.setIdentityMapping(Arrays.asList(new Tuple2<>("ID", "ID")));

//创建管道,并设定缓冲区为1000条数据
Pipe pipe = new Pipe(1000);
//连接表输入和输出节点
pipe.connect(sqlInputNode, upsertOutputNode);

//创建数据流实例
Dataflow dataflow = new Dataflow(sqlInputNode);
//启动数据流,并设定5分钟后超时
dataflow.syncStart(5, TimeUnit.MINUTES);

2. 一个表输入到多个输出

flowchart LR sqlInputNode --pipe--> upsertOutputNode sqlInputNode --pipe--> csvOutputNode
java 复制代码
//创建Oracle数据源
DataSource oracleDataSource = DataSourceUtil.getOracleDataSource();
SqlInputNode sqlInputNode = new SqlInputNode(oracleDataSource, "select * from etl_base.t_resident_info where rownum<=50000 order by id");

//创建Postgres目标数据源
DataSource postgresDataSource = DataSourceUtil.getPostgresDataSource();
UpsertOutputNode upsertOutputNode = new UpsertOutputNode(postgresDataSource, "public.t_resident_info", 1000);
upsertOutputNode.setIdentityMapping(Arrays.asList(new Tuple2<>("ID","ID")));

//创建csv文件目标
FileOutputNode fileOutputNode = new FileOutputNode("E:/output_" + System.currentTimeMillis() + ".csv", FileOutputNode.Format.CSV);

//创建管道并连接Oracle和Postgres
Pipe pipe = new Pipe(1000);
pipe.connect(sqlInputNode,upsertOutputNode);

//创建管道并连接Oracle和csv文件
Pipe pipe_2 = new Pipe(1000);
pipe_2.connect(sqlInputNode,fileOutputNode);

//创建数据流并启动
Dataflow dataflow = new Dataflow(sqlInputNode);
dataflow.syncStart();

🏗️ 架构概览

Etl-engine 核心仅由以下3个主要组件构成:

  • Node (节点): 数据的起点、终点和数据转换逻辑载体。
  • Pipe (管道): 负责在节点间传递数据的非阻塞缓存队列。
  • Dataflow (数据流): 任务的编排器和执行入口。
相关推荐
冉冰学姐1 分钟前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly8 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客17 分钟前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.20 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐25 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_999927 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学1 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.1 小时前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann