# etl-tool **Repository Path**: mgb/etl-tool ## Basic Information - **Project Name**: etl-tool - **Description**: **ETL Tool** 是一个基于 Spring Boot 构建的企业级数据集成平台,专注于提供**轻量、高效、可扩展**的 ETL (Extract, Transform, Load) 解决方案。它帮助用户快速实现异构数据源之间的数据同步、结构化文件导入、定时调度执行及全流程监控。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 8 - **Created**: 2026-07-17 - **Last Updated**: 2026-07-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

Spring Boot Java 8+ License Maven Status

🔄 ETL Tool

企业级 ETL 数据集成平台 — 轻量、高效、可扩展

支持多种数据源之间的数据同步、文件导入、定时调度与实时监控

--- ## 📋 目录 - [项目简介](#-项目简介) - [核心特性](#-核心特性) - [技术栈](#-技术栈) - [架构设计](#-架构设计) - [快速开始](#-快速开始) - [配置文件说明](#-配置文件说明) - [API 文档](#-api-文档) - [使用指南](#-使用指南) - [测试](#-测试) - [项目结构](#-项目结构) - [FAQ](#-faq) - [贡献指南](#-贡献指南) - [许可证](#-许可证) --- ## 🎯 项目简介 ## 项目所有内容由Zed+deepseek-v4-flash编写。功能使用正常已验证,项目也适合学习使用(除了这句话,其它都是AI写的,包括文档。DeepSeek API我前后开发+调试纠错共花了¥5.71) **ETL Tool** 是一个基于 Spring Boot 构建的企业级数据集成平台,专注于提供**轻量、高效、可扩展**的 ETL (Extract, Transform, Load) 解决方案。它帮助用户快速实现异构数据源之间的数据同步、结构化文件导入、定时调度执行及全流程监控。 ### 适用场景 | 场景 | 说明 | |------|------| | 📊 数据仓库建设 | 从业务库抽取数据到数仓 | | 🔄 数据库迁移 | 跨数据库类型的数据迁移与同步 | | 📁 文件数据入库 | Excel/CSV 结构化数据批量导入 | | ⏰ 定时同步任务 | 按 Cron 表达式定期执行数据同步 | | 🏢 企业数据整合 | 多源异构数据的统一整合 | --- ## ✨ 核心特性 ### 🔌 多数据源支持 - **已支持**:MySQL、PostgreSQL、Oracle(12c/19c/21c)、Oracle 11g、SQL Server、SQL Server (pre-2012 via JTDS)、H2 - **Schema 配置**:支持 PostgreSQL、Oracle、SQL Server 的 Schema 配置,表浏览器按 Schema 分组折叠展示 - **向后兼容**:SQL Server 2008 以下选择 `SQLServer (pre-2012)` 使用 JTDS 驱动(避免 TLS 不兼容);Oracle 11g 选择 `Oracle 11g` 使用 ROWNUM 分页 + SID 格式 JDBC URL - **扩展能力**:通过 `JdbcUtils` 可快速扩展任意 JDBC 兼容数据库 - 支持可视化配置,连接测试,连接池参数调优 ### ⚡ 高性能 ETL 引擎 - **分页批量处理**:支持大数据量分页查询(默认 **50000 条/页**),逐页提取 → 逐页写入,避免全量加载到内存,可处理千万级数据 - **批量写入优化**:支持 `rewriteBatchedStatements`(MySQL 自动启用),将批量 INSERT 合并为单条多值 SQL,大幅提升写入吞吐量 - **可配置批处理大小**:页面中可直接配置批量提交条数(默认 **3000 条/批**),每 3000 条提交一次事务,平衡内存占用与写入性能 - **多写入模式**:INSERT / UPSERT / TRUNCATE-INSERT - **数据库适配**:自动识别目标库语法(MySQL `ON DUPLICATE KEY`、PostgreSQL `ON CONFLICT`、Oracle/SQL Server `MERGE`) - **自动建表**:支持根据源表结构在目标库自动创建表 - **逐行降级**:批量执行失败时自动降级为逐行插入,保证数据不丢失 ### 🔄 灵活的数据转换 - **8 种内置转换函数**:`UPPER`、`LOWER`、`TRIM`、`REPLACE`、`CONCAT`、`SUBSTRING`、`DATE_FORMAT`、`TO_INTEGER` 等 - **字段级映射**:支持源-目标列名映射,默认值设置 - **表达式转换**:支持自定义转换表达式 - **模式对比**:可视化对比源-目标表结构差异 ### 🧠 智能 SQL 解析与列映射 - **SQL 字段自动填充**:基于 SQL 查询的作业,编辑页面自动从数据库解析 SQL 字段名/别名(优先使用别名),自动填充到 Source Column 和 Target Column - **自动刷新**:编辑 SQL 后点击 `↻ Reload Columns` 按钮,自动重新解析并更新列映射 ### 📁 文件导入 - **格式支持**:Excel (`.xlsx`/`.xls`) 和 CSV (`.csv`/`.tsv`/`.txt`) - **列映射**:支持文件字段到目标表字段的自定义映射,可重命名、跳过字段、设置默认值 - **字段转换**:支持 UPPER/LOWER/TRIM 等转换函数 - **智能解析**:自动检测文件类型、编码、分隔符 - **预览功能**:导入前预览文件前 N 行数据 - **Excel 多Sheet**:支持选择特定 Sheet ### ⏰ 任务调度 - **Quartz 集成**:企业级任务调度引擎 - **Cron 表达式**:灵活定义执行频率 - **运行时管理**:启动、停止、暂停任务 ### 📊 监控与日志 - **实时执行进度**:任务详情页实时展示进度条(百分比)、已处理/总条数/剩余/错误数、处理速度 (rows/s)、耗时 - **运行时日志**:每次批量提交后自动写入进度日志(如 "Processed: 7500 / 10000 rows | Errors: 0 | Elapsed: 45s") - **2秒轮询刷新**:执行中页面自动轮询,无需手动刷新即可看到最新进度 - **运行状态标识**:任务列表和详情页支持 `RUNNING` 状态(黄色标签),一目了然 - **全流程追踪**:记录每个作业的执行状态、耗时、数据量 - **失败重试**:可配置重试次数和延迟 - **统计看板**:数据源/作业统计、执行趋势、失败概览 ### 🏗️ 架构特性 - **密码加密**:数据源密码 AES-256/GCM 加密存储 - **模块解耦**:数据源/作业/导入/调度完全独立 - **RESTful API**:提供完整的 REST API,易于集成 - **管理界面**:基于 Thymeleaf 的现代化管理后台 --- ## 🛠 技术栈 | 分类 | 技术 | 版本 | |------|------|------| | **框架** | Spring Boot | 2.7.18 | | **ORM** | Spring Data JPA / Hibernate | - | | **数据库(元数据)** | H2 (文件/内存模式) | - | | **数据库驱动** | MySQL Connector / PostgreSQL / Oracle / SQL Server | - | | **前端** | Thymeleaf + HTML5 + CSS3 + JavaScript | - | | **任务调度** | Quartz Scheduler | - | | **文件处理** | Apache POI (Excel) / OpenCSV (CSV) | 5.2.5 / 5.9 | | **安全** | AES-256/GCM 加密 | - | | **工具** | Lombok / Jackson / Commons-IO / Commons-Lang3 | - | | **构建** | Maven | 3.6+ | | **测试** | JUnit 5 / Mockito / Spring MockMvc | - | | **最低 JDK** | **Java 8** | - | --- ## 🏗 架构设计 ``` ┌────────────────────────────────────────────────────────────┐ │ Web Layer (Controllers) │ │ ┌───────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │ │ DataSource│ │ EtlJob │ │FileImport│ │ Index/Log │ │ │ │ Controller│ │Controller│ │Controller│ │ Controllers │ │ │ └─────┬─────┘ └────┬─────┘ └────┬─────┘ └──────┬───────┘ │ └────────┼─────────────┼────────────┼──────────────┼─────────┘ │ │ │ │ ┌────────┼─────────────┼────────────┼──────────────┼──────────┐ │ ▼ ▼ ▼ ▼ │ │ Service Layer │ │ ┌──────────────────┐ ┌──────────────────────┐ │ │ │DynamicDataSource │ │ EtlExecutionService│ │ │ │ Service │ │ (ETL Engine) │ │ │ ├──────────────────┤ ├──────────────────────┤ │ │ │ • 连接管理 │ │ • 数据抽取(SQL/Table) │ │ │ │ • 连接测试 │ │ • 数据转换 │ │ │ │ • 元数据查询 │ │ • 批量加载 │ │ │ └──────────────────┘ └──────────────────────┘ │ │ ┌──────────────────┐ ┌──────────────────────┐ │ │ │ EtlJobService │ │ FileImportService │ │ │ │ (作业CRUD) │ │ (文件导入引擎) │ │ │ ├──────────────────┤ ├──────────────────────┤ │ │ │ • 作业定义 │ │ • Excel/CSV解析 │ │ │ │ • 列映射管理 │ │ • 自动建表 │ │ │ │ • 状态管理 │ │ • 批量写入 │ │ │ └──────────────────┘ └──────────────────────┘ │ │ ┌──────────────────┐ ┌──────────────────────┐ │ │ │ SchemaSyncService│ │ SchedulerService │ │ │ │ (模式同步) │ │ (Quartz调度) │ │ │ └──────────────────┘ └──────────────────────┘ │ │ ┌─────────────────────────────────────────────┐ │ │ │ EtlStatisticsService │ │ │ │ (统计与仪表板) │ │ │ └─────────────────────────────────────────────┘ │ └────────┬─────────────┬────────────┬──────────────┬──────────┘ │ │ │ │ ┌────────┼─────────────┼────────────┼──────────────┼──────────┐ │ ▼ ▼ ▼ ▼ │ │ Repository / Data Access Layer │ │ ┌──────────────┐ ┌──────────┐ ┌────────────────┐ │ │ │ JPA Repos │ │ JDBC │ │ File I/O │ │ │ │ (元数据存储) │ │ (动态连接)│ │ (Excel/CSV) │ │ │ └──────┬───────┘ └────┬─────┘ └───────┬────────┘ │ └─────────┼──────────────┼───────────────┼────────────────────┘ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌────────────┐ ┌──────────┐ │ H2 │ │ MySQL / PG │ │ 文件系统 │ │(元数据DB)│ │ Oracle/MS │ │(上传/临时)│ └─────────┘ │ SQL / H2 │ └──────────┘ └────────────┘ ``` --- ## 🚀 快速开始 ### 环境要求 - **JDK**: 8 或更高版本 - **Maven**: 3.6+ - **磁盘**: 至少 500MB 可用空间(运行时可自动创建) ### 下载与运行 ```bash # 1. 克隆项目 git clone https://github.com/your-username/etl-tool.git cd etl-tool # 2. 编译打包 mvn clean package -DskipTests # 3. 运行 java -jar target/etl-tool-1.0.0.jar # 4. 打开浏览器访问 # http://localhost:8080/etl-tool/ ``` 启动后,系统会自动创建 H2 文件数据库用于存储元数据(数据源配置、作业定义、执行日志等),默认使用 `./data/etl-tool` 目录。 ### 默认端口 | 服务 | 地址 | |------|------| | Web 管理界面 | http://localhost:8080/etl-tool/ | | H2 控制台 | http://localhost:8080/etl-tool/h2-console | | Actuator 健康检查 | http://localhost:8080/etl-tool/actuator/health | --- ## 📝 配置文件说明 核心配置文件位于 `src/main/resources/application.yml`: ```yaml server: port: 8080 servlet: context-path: /etl-tool spring: datasource: url: jdbc:h2:file:./data/etl-tool # 元数据存储路径 username: sa password: jpa: hibernate: ddl-auto: update # 自动建表/更新 # ETL 引擎参数 etl: batch: size: 3000 # 目标端批处理大小(行/事务),页面可配置 commit-interval: 3000 # 提交间隔 execution: max-retries: 3 # 最大重试次数 retry-delay-ms: 5000 # 重试延迟(毫秒) timeout-minutes: 60 # 作业超时时间(分钟) temp: dir: ./data/temp # 临时文件目录 export: dir: ./data/export # 导出目录 ``` --- ## 📚 API 文档 ### 数据源管理 | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/datasources` | 获取所有数据源 | | `GET` | `/api/datasources/{id}` | 获取单个数据源 | | `POST` | `/api/datasources` | 创建数据源 | | `PUT` | `/api/datasources/{id}` | 更新数据源 | | `DELETE` | `/api/datasources/{id}` | 删除数据源 | | `POST` | `/api/datasources/test` | 测试连接(未保存前) | | `POST` | `/api/datasources/{id}/test` | 测试连接(已保存) | | `GET` | `/api/datasources/{id}/tables` | 获取表列表 | | `GET` | `/api/datasources/{id}/tables/{name}/columns` | 获取表列信息 | | `GET` | `/api/datasources/{id}/tables-with-schema` | 获取表列表(含 Schema 信息,用于按 Schema 分组) | | `POST` | `/api/datasources/{id}/sql-columns` | 从 SQL 查询解析字段名/别名(编辑 SQL 作业时使用) | ### ETL 作业管理 | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/jobs` | 获取所有作业 | | `GET` | `/api/jobs/{id}` | 获取作业详情(含列映射) | | `POST` | `/api/jobs` | 创建作业 | | `PUT` | `/api/jobs/{id}` | 更新作业 | | `DELETE` | `/api/jobs/{id}` | 删除作业 | | `PATCH` | `/api/jobs/{id}/status` | 更新作业状态 | | `POST` | `/api/jobs/{id}/execute` | 立即执行(同步) | | `POST` | `/api/jobs/{id}/execute-async` | 立即执行(异步) | | `POST` | `/api/jobs/{id}/stop` | 停止执行 | | `GET` | `/api/jobs/{id}/executions` | 获取执行历史 | | `GET` | `/api/jobs/{id}/latest-execution` | 获取最新一次执行记录(含实时进度日志) | | `POST` | `/api/jobs/{id}/schedule` | 设置定时调度 | | `DELETE` | `/api/jobs/{id}/schedule` | 取消定时调度 | | `POST` | `/api/jobs/compare-schema` | 对比表结构 | | `POST` | `/api/jobs/sync-schema` | 同步表结构 | ### 文件导入 | 方法 | 路径 | 说明 | |------|------|------| | `POST` | `/api/import/file` | 上传并导入文件 | | `POST` | `/api/import/preview` | 预览文件内容 | | `GET` | `/api/import/jobs` | 获取导入历史 | | `GET` | `/api/import/jobs/{id}` | 获取导入详情 | | `POST` | `/api/import/excel/sheets` | 获取 Excel Sheet 列表 | ### 日志查询 | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/logs` | 分页查询执行日志 | | `GET` | `/api/logs/{id}` | 获取日志详情 | | `GET` | `/api/logs/job/{jobId}` | 按作业查询日志 | | `GET` | `/api/logs/recent` | 获取最近日志 | --- ## 💡 使用指南 ### 1️⃣ 添加数据源 进入 **数据源管理** 页面,点击 **新增数据源**: - 选择数据库类型(MySQL/PostgreSQL/Oracle/Oracle 11g/SQL Server/SQL Server pre-2012/H2) - 填写连接信息(主机、端口、数据库名、用户名、密码) - **Schema**(PostgreSQL/Oracle/Oracle 11g/SQL Server 可选):指定 Schema 名称,为空时显示所有 Schema 的表 - 点击 **测试连接** 验证 - 保存后即可在作业中使用 - **查看表列表**:点击数据源的 **View** 按钮,右侧展示该数据源下的表。MySQL/H2 直接平铺表名;PostgreSQL/Oracle 按 Schema 分组折叠展示,点击 Schema 标题展开该分组 ### 2️⃣ 创建 ETL 作业 进入 **作业管理** 页面,点击 **新建作业**: 1. **基本信息**:填写作业名称和描述 2. **选择数据源**:选择源和目标数据源 3. **数据抽取**:选择 **Table**(自动列出源库表)或 **SQL Query**(输入自定义 SQL) - 若选择 **SQL Query**,可在编辑时点击 `↻ Reload Columns` 按钮自动从 SQL 解析字段名/别名并填充列映射 4. **列映射**:自动加载源-目标列,支持手动调整映射关系、数据类型、转换函数 5. **写入配置**: - **Write Mode**:INSERT / UPSERT / TRUNCATE-INSERT - **Batch Size**:配置目标端批量提交条数(默认 **3000**),每批提交一次事务 - **Page Size**:配置源端分页查询条数(默认 **50000**),每页查询一次,避免大数据量时内存溢出 6. **定时调度**(可选):配置 Cron 表达式 7. 保存后即可 **执行** 或 **定时执行** ### 3️⃣ 导入文件 进入 **文件导入** 页面: 1. 选择文件(`.xlsx`/`.xls`/`.csv`) 2. 选择目标数据源和目标表 3. 配置导入选项(Sheet、分隔符、编码等) 4. 点击 **预览** 确认数据 — 预览后自动显示 **Column Mappings** 列映射表 5. **调整列映射**(可选): - 修改 **Target Column** 将文件字段映射到不同的目标列名 - 选择 **Transformation** 应用转换(UPPER/LOWER/TRIM 等) - 填写 **Default Value** 为空值提供默认值 - 点击 **X** 跳过不需要的列 - 点击 **+ Add Mapping** 添加自定义映射 6. 点击 **导入** 开始导入 — 数据根据列映射规则写入目标表 ### 4️⃣ 监控执行 #### 实时进度监控 进入作业详情页,当任务正在执行时,页面顶部自动显示 **执行进度卡片**: - 📊 **进度条** + 百分比,直观展示完成度 - 📋 **数据指标**:总条数 / 已处理 / 剩余 / 错误数 / 耗时 / 处理速度(rows/s) - 📝 **进度日志**:每次批量提交后实时写入(如 "Processed: 7500 / 10000 rows | Errors: 0 | Elapsed: 45s") - 🔄 **自动刷新**:每 2 秒轮询一次,无需手动刷新 - 🚀 **分页处理**:大数据量时采用分页查询(默认 50000 条/页),逐页处理,避免长时间无响应 - 任务执行完成后自动显示最终状态(✅ 成功 / ❌ 失败) #### 执行历史查询 进入 **执行日志** 页面: - 查看所有作业的执行历史 - 按作业、状态、时间范围筛选 - 点击详情查看错误信息 --- ## 🧪 测试 项目包含 **75 个单元测试**,覆盖所有核心业务逻辑: ```bash # 运行全部测试 mvn test # 运行特定测试 mvn test -Dtest=DynamicDataSourceServiceTest # 生成测试报告 mvn surefire-report:report ``` ### 测试覆盖范围 | 测试类别 | 测试数 | 覆盖内容 | |---------|--------|---------| | DTO 测试 | 7 | 实体-DTO 转换、API 响应封装、Schema 字段映射 | | 工具类测试 | 21 | JDBC 工具、AES 加密、SQL 分页构建 | | Service 测试 | 28 | 数据源 CRUD、作业管理、ETL 执行引擎、调度、统计、Schema 表查询 | | Controller 测试 | 21 | 数据源/作业/文件导入 REST API | --- ## 📦 项目结构 ``` etl-tool/ ├── pom.xml # Maven 构建文件 ├── README.md # 本文件 ├── src/ │ ├── main/ │ │ ├── java/com/etltool/ │ │ │ ├── EtlToolApplication.java │ │ │ ├── config/ # 配置类 │ │ │ ├── model/ # JPA 实体 (5) │ │ │ ├── dto/ # 数据传输对象 (9) │ │ │ ├── repository/ # 数据仓库 (5) │ │ │ ├── service/ # 业务逻辑 (7) │ │ │ ├── web/ # REST 控制器 (5) │ │ │ ├── exception/ # 异常定义 (3+1 全局处理) │ │ │ └── util/ # 工具类 (5) │ │ └── resources/ │ │ ├── application.yml │ │ ├── static/css/style.css │ │ ├── static/js/main.js │ │ └── templates/ # Thymeleaf 视图 (12) │ └── test/ │ ├── java/com/etltool/ │ │ ├── dto/ # DTO 测试 │ │ ├── util/ # 工具类测试 │ │ ├── web/ # Controller 测试 │ │ └── service/ # Service 测试 │ └── resources/ │ └── application.yml # 测试配置 ``` --- ## ❓ FAQ **Q: 支持哪些数据库类型?** A: 目前支持 MySQL、PostgreSQL、Oracle、SQL Server、H2。通过扩展 `JdbcUtils` 可以添加更多 JDBC 兼容数据库。 **Q: 上传文件大小有限制吗?** A: 默认单文件最大 200MB,可在 `application.yml` 中通过 `spring.servlet.multipart.max-file-size` 调整。 **Q: 如何修改元数据存储位置?** A: 修改 `application.yml` 中的 `spring.datasource.url`,默认使用 H2 文件数据库,也可以切换为其他数据库。 **Q: 支持增量同步吗?** A: 可以通过在源端 SQL 中使用 `WHERE` 条件实现基于时间戳或增量字段的增量抽取。 **Q: 如何配置邮件告警?** A: 可以在 `EtlExecutionService` 中扩展,在作业失败时通过 Spring Mail 发送通知。 --- ## 🏆 同类项目对比 ### 对标项目 | 类型 | 项目 | 定位 | |------|------|------| | **开源** | **Kettle (Pentaho PDI)** v9.x | 老牌开源 ETL,桌面端设计器 | | **开源** | **Apache NiFi** v2.x | 数据流自动化平台 | | **开源** | **Alibaba DataX** | 离线批量数据同步工具 | | **商业** | **Informatica PowerCenter** | 企业级数据集成标杆 | | **商业** | **Talend Data Integration** | 开源+商业双模式数据集成 | --- ### 多维度对比矩阵 | 维度 | **本项目** | **Kettle (PDI)** | **Apache NiFi** | **DataX** | **Informatica** | **Talend** | |------|:--------:|:----------------:|:---------------:|:---------:|:---------------:|:----------:| | **部署方式** | 轻量 JAR 包 | 重量级 GUI+Server | Java Agent 集群 | 单机命令行 | 企业级集群 | 独立/云部署 | | **安装复杂度** | ⭐⭐⭐⭐⭐ 零配置 | ⭐⭐ 需 JDK+GUI | ⭐⭐ 需 ZooKeeper | ⭐⭐⭐⭐ CLI 即可 | ⭐ 复杂集群搭建 | ⭐⭐ 需配置 | | **启动时间** | ~10秒 | ~30秒+ | ~60秒+ | 秒级 | ~数分钟 | ~30秒 | | **Web 管理界面** | ✅ 内置 Thymeleaf | ❌ 需 Carte/Spoon | ✅ 内置 | ❌ 无 | ✅ 企业级 UI | ✅ Web + Studio | | **REST API** | ✅ 完整 RESTful | ⚠️ 有限 | ✅ 全面 | ❌ 无 | ✅ 完整 | ✅ 完整 | | **多数据源** | 5种 (可扩展) | 30+ 种 | 100+ 处理器 | MySQL/OSS 为主 | 50+ 种 | 100+ 种 | | **SQL 抽取** | ✅ 自定义 SQL | ✅ 可视化 | ⚠️ 需 GetSQL | ✅ 只读模式 | ✅ 全面 | ✅ 全面 | | **文件导入** | ✅ Excel/CSV | ✅ 多种格式 | ✅ 各种格式 | ❌ 不支持 | ✅ 企业级 | ✅ 全面 | | **数据转换** | 8种函数 | 100+ 步骤 | 300+ 处理器 | 简单类型转换 | 1000+ 转换 | 900+ 组件 | | **调度系统** | ✅ Quartz 内置 | ⚠️ 需 Carte/外部 | ✅ 内置 | ❌ 需外部调度 | ✅ 完整调度 | ✅ 完整调度 | | **血缘分析** | ❌ 无 | ⚠️ 基础 | ✅ 完整 | ❌ 无 | ✅ 企业级 | ✅ 完整 | | **实时流处理** | ❌ 仅批量 | ⚠️ 弱 | ✅ 强 | ❌ 仅批量 | ✅ 支持 | ✅ 支持 | | **版本管理** | ❌ 无 | ⚠️ SVN 手动 | ✅ 有 | ❌ 无 | ✅ Git 集成 | ✅ Git 集成 | | **权限管理** | ❌ 无 | ❌ 无 | ✅ 细粒度 | ❌ 无 | ✅ RBAC | ✅ RBAC | | **高可用** | ❌ 单机 | ⚠️ 集群有限 | ✅ 分布式 | ❌ 单机 | ✅ 集群 | ✅ 集群 | | **监控告警** | 基础日志 | 基础 | ✅ 完整 | ❌ 无 | ✅ 企业级 | ✅ 完整 | | **内存占用** | ~200MB | ~1GB+ | ~2GB+ | ~500MB | ~数GB | ~2GB+ | | **学习成本** | ⭐⭐⭐⭐⭐ 低 | ⭐⭐ 中等 | ⭐⭐ 中高 | ⭐⭐⭐⭐ 低 | ⭐ 高 | ⭐⭐ 中等 | | **二次开发难度** | ⭐⭐⭐⭐⭐ 易(Spring Boot) | ⭐⭐ 插件复杂 | ⭐⭐ 需懂 NiFi 架构 | ⭐⭐⭐ 需改源码 | ⭐ 闭源不可改 | ⭐⭐ 可扩展 | | **Java 8 兼容** | ✅ 完整 | ✅ 完整 | ✅ 2.x 需要 | ✅ 完整 | ✅ | ✅ | | **容器化支持** | ✅ 直接 Docker | ⚠️ 需镜像 | ✅ 官方镜像 | ✅ 可容器化 | ✅ 支持 | ✅ 支持 | --- ### 项目优势 🟢 #### 1️⃣ 轻量极简,零运维 - 单 JAR 包启动,~200MB 内存,10 秒内完成启动 - Kettle 需安装 Java + Spoon GUI + 数据库仓库 + Carte 集群 - NiFi 需 ZooKeeper + 流文件存储,资源消耗大 - 适合中小团队、嵌入式集成、边缘节点场景 #### 2️⃣ Java 8 兼容,老项目友好 - 大多数企业核心系统仍运行在 Java 8 上 - 标准 Spring Boot 架构,任何 Java 开发者可立即上手 - Kettle 的插件开发体系复杂,NiFi 需专门学习处理器 API #### 3️⃣ RESTful API 架构,天然适合微服务集成 - 完整的 JSON API,可与任何前端/系统对接 - Informatica/Talend 虽有 API 但需额外商业授权 - Kettle 的 Carte REST API 功能有限 #### 4️⃣ 嵌入式架构,可被其他系统集成 - 可作为 Maven 依赖引入其他 Spring Boot 项目 - 可自定义扩展数据源类型、转换函数 - DataX 是 CLI 工具无法嵌入,NiFi/Kettle 太重 - 适合作为数据中台的轻量级组件 #### 5️⃣ 代码即文档,全开源透明 - 44 个 Java 源文件、75 个测试用例,代码覆盖全面 - 相比 Kettle 的 .ktr/.kjb XML 黑盒配置,更易审查和调试 - 相比商业产品,无 License 限制和 Vendor Lock-in 风险 --- ### 项目劣势 🟥 #### 1️⃣ 数据源连接器生态薄弱 - 仅内置 5 种数据库 + Excel/CSV - Kettle 有 30+ 连接器,NiFi 有 300+ 处理器 - 云数据源(BigQuery、Snowflake、Redshift)、NoSQL、消息队列均暂不支持 #### 2️⃣ 缺少可视化设计器 - 当前通过 JSON 配置列映射,无拖拽式 ETL 流程设计 - Kettle 的 Spoon 和 Talend Studio 提供成熟的图形化设计器 - 非技术用户难以直接使用 #### 3️⃣ 缺乏企业级治理能力 - ❌ 无数据血缘(Lineage)追踪 - ❌ 无版本管理(Git/SVN 集成) - ❌ 无访问控制/RBAC - ❌ 无数据质量校验模块 - ❌ 无 SLA 监控告警 - Informatica 的血缘分析是企业数据治理的标配 #### 4️⃣ 性能和扩展性瓶颈 - 单机架构,无法水平扩展 - 批量处理但无并行执行框架(如 MapReduce/Spark) - DataX 支持通道(Channel)并行,Kettle 支持分区(Partition) - NiFi 天然分布式架构 #### 5️⃣ 实时/流处理能力缺失 - 仅支持批处理模式,无法处理实时数据流 - NiFi 支持流式处理(背压、优先级排队) - CDC(变更数据捕获)、实时同步等场景需配合外部工具 #### 6️⃣ 运维监控能力基础 - 只有基础的执行日志记录 - 无 Prometheus/Grafana 集成 - 无钉钉/邮件/Webhook 告警 - 对比 NiFi 有内置的 Bulletin Board + Provenance Repository --- ### 综合定位评分 ``` 适用场景评分 (5分制) 中小团队/单体项目 ████████████████ 4.5/5 快速原型/PoC ████████████████ 4.5/5 嵌入式集成/数据中台 ████████████████ 4.0/5 数据库间数据同步 ████████████████ 4.0/5 文件批量入库 ████████████████ 3.5/5 学习/教学/培训 ████████████████ 4.5/5 企业级生产环境 ████████████░░░ 2.5/5 流式/实时数据处理 ██████░░░░░░░░░ 1.5/5 大数据生态(Hadoop) ████░░░░░░░░░░░ 1.0/5 多云数据集成 ██████░░░░░░░░░ 1.5/5 复杂ETL编排 █████████░░░░░░ 2.5/5 数据治理/血缘 ██░░░░░░░░░░░░░ 0.5/5 ``` --- ### 改进路线图 | 优先级 | 改进项 | 预期效果 | |:------:|--------|----------| | 🔴 P0 | 数据源 SPI 插件化 | 可插拔扩展任意数据库/API/消息队列 | | 🔴 P0 | 列映射可视化(拖拽) | 降低非技术用户使用门槛 | | 🟡 P1 | 并行执行引擎 | 提升大数据量同步性能 10x+ | | 🟡 P1 | 数据血缘追踪 | 满足企业数据治理准入 | | 🟡 P1 | Prometheus 指标导出 | 对接现有监控体系 | | 🟢 P2 | 增量同步(CDC/Watermark) | 支持实时/准实时同步 | | 🟢 P2 | 数据质量校验规则 | 提升数据可信度 | | 🟢 P2 | Git 版本管理集成 | 实现 CI/CD 发布 | | 🔵 P3 | 分布式集群模式 | 水平扩展支撑 TB 级数据 | | 🔵 P3 | Webhook/邮件告警 | 异常及时发现 | --- ## 🤝 贡献指南 欢迎贡献代码、报告问题或提出建议! 1. **Fork** 本仓库 2. 创建您的特性分支 (`git checkout -b feature/amazing-feature`) 3. 提交您的更改 (`git commit -m 'feat: add amazing feature'`) 4. 推送到分支 (`git push origin feature/amazing-feature`) 5. 打开一个 **Pull Request** ### 开发规范 - 遵循阿里巴巴 Java 开发手册 - 保持 Java 8 兼容性 - 为新功能编写单元测试 - 使用有意义的提交信息 --- ## 📄 许可证 本项目基于 **Apache License 2.0** 开源许可证发布。 ``` Copyright 2024 ETL Tool Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ``` ---

Made with ❤️ by the ETL Tool Team
Built with Spring Boot · Java · Open Source