文章目录
- 一文读懂 ETL:数据流转的核心引擎
- 一、什么是 ETL?
- 二、ETL 的核心流程
- 1. Extract(抽取)
- 2. Transform(转换)
- 数据清洗
- 数据转换
- 数据加工
- 3. Load(加载)
- 三、ETL 的两种典型模式
- 1. 离线 ETL(Batch)
- 2. 实时 ETL(Streaming)
- 四、ETL 在工程中的实际形态
- 五、什么时候需要复杂 ETL(DAG / 图结构)?
- 1. 多依赖任务
- 2. 条件分支
- 3. 并行处理
- 4. 重试与容错
- 六、ETL vs ELT
- ETL(先转后存)
- ELT(先存后转)
- 七、ETL 的设计最佳实践
- 1. 保持幂等性
- 2. 支持增量处理
- 3. 数据校验(Data Quality)
- 4. 可观测性
- 5. 解耦设计
- 八、总结
一文读懂 ETL:数据流转的核心引擎
在数据驱动的系统中,ETL 是一个绕不开的基础概念。无论是数据仓库、数据湖,还是实时分析平台,ETL 都扮演着“数据搬运工 + 加工厂”的关键角色。
本文将系统介绍 ETL 的概念、流程、架构设计以及在实际工程中的应用。
一、什么是 ETL?
ETL 是三个英文单词的缩写:
- Extract(抽取):从数据源获取数据
- Transform(转换):对数据进行清洗、加工、转换
- Load(加载):将处理后的数据写入目标系统
简单来说,ETL 就是:
👉把数据从 A 系统取出来,加工后送到 B 系统
二、ETL 的核心流程
1. Extract(抽取)
数据来源可以非常多样:
- 数据库(MySQL / PostgreSQL)
- 日志系统(如应用日志、埋点数据)
- 第三方 API
- 消息队列(Kafka、RabbitMQ)
- 文件(CSV / JSON / Parquet)
注:Apache Parquet:Apache Hadoop生态系统中的一种免费开源的面向列的数据存储格式
关键点:
- 增量 vs 全量抽取
- 数据一致性(快照 / binlog / CDC)
- 抽取性能与限流控制
2. Transform(转换)
这是 ETL 的核心价值所在,主要包括:
数据清洗
- 去重
- 空值处理
- 格式修正(时间、编码等)
数据转换
- 字段映射(字段重命名)
- 类型转换(string → int)
- 结构扁平化(JSON → 表结构)
数据加工
- 聚合(SUM / COUNT)
- 关联(JOIN)
- 衍生字段计算
👉 本质:让“原始数据”变成“可用数据”
3. Load(加载)
目标系统通常包括:
- 数据仓库(如 Hive / Snowflake)
- OLAP 系统(ClickHouse / Druid)
- 搜索引擎(Elasticsearch)
- 业务数据库
加载方式:
- 批量写入(Batch)
- 实时写入(Streaming)
- Upsert(更新或插入)
关键点:
- 幂等性(避免重复写)
- 写入性能
- 数据分区(Partition)
三、ETL 的两种典型模式
1. 离线 ETL(Batch)
特点:
- 定时执行(如每小时、每天)
- 处理大规模数据
- 延迟较高(分钟级~小时级)
常见工具:
- Airflow(调度)
- Spark(计算)
- Hive(存储)
适用场景:
- 报表分析
- 数据仓库建模
2. 实时 ETL(Streaming)
特点:
- 实时处理数据流
- 延迟低(毫秒~秒级)
- 架构更复杂
常见技术:
- Kafka(数据流)
- Flink / Spark Streaming(计算)
- CDC(变更数据捕获)
适用场景:
- 实时推荐
- 风控系统
- 实时监控
四、ETL 在工程中的实际形态
示例中提到:
indexer/worker(索引流水线):顺序 ETL,无需条件路由
这是一个非常典型的轻量级 ETL 流水线,其特点是:
- 单向流动(线性 pipeline)
- 无复杂分支(no DAG)
- 顺序执行(Extract → Transform → Load)
这种场景下:
👉没必要引入复杂的工作流引擎(如 DAG / Graph)
因为:
- 没有条件分支
- 没有并行依赖
- 没有复杂调度
简单的代码 pipeline 更高效、可维护性更好。
五、什么时候需要复杂 ETL(DAG / 图结构)?
并不是所有 ETL 都简单,当出现以下情况时,可以考虑引入 DAG(有向无环图):
1. 多依赖任务
例如:
A → B → D A → C → DD 依赖 B 和 C,这时就需要 DAG 调度。
2. 条件分支
例如:
- 数据质量 OK → 正常入库
- 数据异常 → 进入修复流程
3. 并行处理
- 多数据源并发抽取
- 多维度聚合计算
4. 重试与容错
- 某一步失败需要重试
- 支持断点续跑
六、ETL vs ELT
现代数据架构中,还有一个常见概念:ELT
ETL(先转后存)
数据源 → 转换 → 数据仓库ELT(先存后转)
数据源 → 数据仓库 → 转换区别:
| 对比项 | ETL | ELT |
|---|---|---|
| 转换位置 | 数据进入前 | 数据进入后 |
| 计算位置 | ETL 引擎 | 数据仓库 |
| 适合场景 | 传统系统 | 云数据仓库(如 Snowflake) |
👉 现在越来越多系统采用 ELT,因为数据仓库计算能力更强。
七、ETL 的设计最佳实践
1. 保持幂等性
重复执行不影响结果(避免脏数据)
2. 支持增量处理
避免全量扫描,提高效率
3. 数据校验(Data Quality)
- 行数校验
- 字段范围校验
- 唯一性检查
4. 可观测性
- 日志(Logs)
- 指标(Metrics)
- 链路追踪(Tracing)
5. 解耦设计
- 抽取 / 转换 / 加载模块分离
- 使用消息队列解耦
八、总结
ETL 本质是数据系统中的“流水线”:
- Extract:把数据拿进来
- Transform:把数据变干净、有用
- Load:把数据送到目标系统
在工程实践中:
- 简单场景 →线性 ETL pipeline 足够
- 复杂场景 →引入 DAG / 工作流调度
👉 关键不是“用不用复杂架构”,而是:
让复杂度匹配业务需求,而不是过度设计