1 ETL/ELT 基本概念
1.1 定义:Extract、Transform、Load
ETL 与 ELT 是数据集成领域常见的两种流程范式。其基本含义可以概括为三步:从分散系统获取数据(Extract,抽取);对数据进行清洗、标准化、结构建模或规则计算(Transform,转换);将处理后的结果写入目标位置(Load,装载)。
- ETL:抽取后先完成转换,再将结果装载到目标系统。
- ELT:抽取后将原始或半处理数据装载到目标系统,再在目标系统内执行转换。
这种范式的核心价值在于把“数据如何进入系统”“如何被处理成可用的形态”“最终落到哪里供使用”形成可管理的流程,并便于在批处理、准实时或实时化场景中扩展。
1.2 ETL 与 ELT 的核心区别
两者差异集中在“转换发生在加载之前还是之后”。
- ETL 的转换前置:转换工作更多发生在装载目标系统之外,通常需要在独立计算环境中完成清洗、建模、指标生成等步骤。优点是可在进入目标系统前降低脏数据风险;缺点是会额外占用外部计算资源,并可能增加从外部系统到目标系统的传输压力。
- ELT 的转换后置:先把数据写入目标系统,再利用目标系统的计算能力完成处理。优点是利用目标端的并行执行与统一管理,简化数据落地链路;缺点是目标系统需要承担更多计算与存储开销,并且若缺乏质量门禁策略,可能导致较多未清洗数据进入后续流程。
从工程角度看,选择往往不是“谁更先进”,而是取决于目标平台的算力与存储特性、团队运维能力以及对时延的要求。
1.3 常见应用场景概览
ETL/ELT 常用于将来自多个业务系统的数据汇总到分析层或沉淀层,典型场景包括:
- 数据仓库与报表:将多源数据加工成维度模型、指标口径一致的事实数据供查询。
- 数据湖与湖仓一体:以更灵活的方式先落地再处理,支持多种分析任务演进。
- 数据质量校验与治理:通过规则校验、血缘记录、异常告警等把数据可靠性纳入流程。
- 批处理到准实时:定时或事件触发的装载流程,配合增量抽取与回补机制降低延迟。
- 元数据管理与目录建设:把作业配置、数据资产、运行日志与质量结果形成可追踪的体系。
1.4 相关术语与相邻概念(如数据管道)
在实际工程中,ETL/ELT 常与“数据管道(data pipeline)”“数据编排(orchestration)”“数据集成(data integration)”“数据治理(data governance)”等概念并用。数据管道通常指端到端的数据流转链路;ETL/ELT 则是管道中的核心加工范式。与之相邻的还有:
2 抽取(Extract)环节
2.1 数据来源类型
2.1.1 关系型数据库
关系型数据库通常提供结构化数据与一致性保证,常见抽取方式包括按表全量拉取、按时间窗口或主键范围增量拉取、以及基于日志的变更读取等。抽取时需要关注事务隔离、主键分布以及变更频率带来的负载波动。
2.1.2 日志与文件系统
日志与文件系统的特点是数据以追加或批量生成的形式出现,适合按文件目录、命名规则或时间分片进行抓取。抽取时常需要处理压缩格式、分隔符差异、日志字段漂移以及文件到达的延迟。
2.1.3 流式数据源
流式数据源面向持续产生的数据,抽取阶段通常表现为消费消息队列或事件流。抽取任务需要维护消费者进度、处理重复投递,并在必要时进行乱序缓冲或补偿。
2.1.4 API 与第三方服务
通过 API 获取数据适合数据可枚举、变化可查询的场景,但通常受限于访问频率、分页与限流策略。工程上会配合重试、缓存、游标分页与签名认证来保证稳定获取。
2.2 抽取方式与策略
2.2.1 全量抽取
全量抽取是将目标数据集的全部内容拉取到处理链路中。它实现简单,但在数据量较大或变化频繁时会带来高成本与长延迟,并增加对网络与存储的压力。很多系统在初次导入或数据规模较小时采用该策略。
2.2.2 增量抽取(基于时间/游标)
增量抽取只获取自上次成功运行以来发生变化的数据。常见手段包括:
- 基于时间窗口:例如按“最后更新时间”或“业务发生时间”过滤。
- 基于游标:例如使用自增主键、消息偏移量或服务返回的游标字段。
增量策略的关键在于边界定义与一致性:时间字段的语义、时区处理以及“更新晚到”都会影响结果正确性。
2.2.3 变更捕获(CDC 思路)
变更捕获通过读取源系统的变更日志来获取插入、更新、删除等操作。CDC 的优势在于更接近真实变更、减少扫描全表;同时也引入对日志保留周期、位置管理与事件顺序的要求。工程实现通常需要幂等落库与冲突处理策略。
2.3 抽取过程中的常见挑战
2.3.1 重复数据与幂等性
网络重试、源端重复投递或分布式消费都可能导致同一条数据被抽取多次。为避免结果膨胀或口径偏差,抽取与后续落库通常需要幂等设计,例如基于唯一键进行去重、采用合并写入(upsert)或记录消费进度。
2.3.2 失败重试与断点续传
抽取任务不可避免会遇到超时、权限失败、网络波动等问题。为降低重跑成本,工程上常结合断点续传(保存游标或偏移量)与分段拉取(按分区或批次)来缩小失败影响范围。
2.3.3 数据一致性与顺序问题
当源数据在抽取期间持续变更时,可能出现跨字段不一致或先后顺序错乱的问题。解决思路包括选择合适的快照机制、在 CDC 场景中按事务或序号处理、以及在下游进行版本化或补偿校验。
3 转换(Transform)环节
3.1 转换的目标与原则
3.1.1 清洗与标准化
清洗与标准化关注“能不能用”。常见工作包括处理缺失值、纠正无效格式、统一单位与编码、规范字段命名与日期格式等。标准化的目标是让不同来源的数据在语义层面尽可能对齐。
3.1.2 结构化与建模
数据常从半结构或原始格式进入系统,转换阶段会将其组织成目标结构。例如建立维度与事实的组织形式、构建宽表或汇总表、以及将事件数据映射为分析所需的模型实体。
3.1.3 质量校验与规则化
转换不仅是“算出来”,也包括“判定是否合格”。通过规则校验将质量要求固化,例如范围约束、必填字段检查、枚举值合法性等,并将结果用于过滤或标记。
3.2 典型转换操作
3.2.1 维度/事实映射
在分析模型中,维度常承载描述性属性,事实通常承载可度量指标。转换阶段会基于键值关系完成映射,并处理口径差异(如时间粒度、状态含义)以保证指标一致。
3.2.2 事实表与指标计算
指标计算常涉及聚合、窗口统计、比率与增长率等。为减少口径漂移,通常会在转换中显式定义口径:例如使用统一的时间窗、过滤规则与归一化逻辑。
3.2.3 去重与合并策略
多源合并与重复投递都可能造成重复记录。常用策略包括基于唯一键的选择(取最新、取最大置信度)、基于时间版本的合并,以及对来自不同来源的冲突进行优先级决策。
3.2.4 类型转换与编码规范
类型转换包括数值精度、日期时区、字符串编码等处理;编码规范则强调对外部系统字段含义的一致表达。良好的规范能显著降低后续查询与建模的返工成本。
3.3 数据质量与治理要点
3.3.1 约束与校验(schema、范围、唯一性)
质量治理的基础是可执行约束。例如 schema 约束用于保证结构正确;范围校验用于排除异常值;唯一性校验用于避免重复键导致的汇总失真。适当的“硬校验”与“软告警”要根据业务风险等级选择。
3.3.2 可追溯性与血缘
可追溯性强调能追问“某个结果从哪里来”。血缘信息记录字段级或表级的来源链路、转换过程与版本差异,从而支持问题定位、影响评估与审计。
3.3.3 数据异常告警
异常告警通常基于质量指标阈值与模式检测触发,例如字段缺失率突增、分布突变、行数异常波动。告警目标是尽快发现加工链路偏离,避免错误结果持续扩散。
4 装载(Load)环节
4.1 目标系统类型
4.1.1 数据仓库(数仓)
数据仓库面向结构化分析,强调模式稳定、查询效率与管理能力。装载阶段通常需要与维度建模、分区策略、索引或物化能力协同。
4.1.2 数据湖与湖仓
数据湖更偏向灵活存储与多格式数据沉淀;湖仓一体则在湖的基础上引入更强的分析与事务能力。装载时会更重视文件布局、分区裁剪与数据文件的演进策略。
4.1.3 分析型查询引擎
一些场景使用可直接对数据进行查询的引擎(例如对外部表或文件进行计算)。此时装载不仅是写入,还包括确保目录注册、元数据同步、以及与查询优化相关的存储组织方式。
4.2 装载模式
4.2.1 批量加载
批量加载按作业批次写入目标系统,适合定时任务、窗口汇总等模式。工程上常配合原子提交或分阶段写入,减少中途失败造成的“半成品可见”问题。
4.2.2 分区与分桶加载
分区将数据按时间或业务维度分开,以便后续查询仅扫描相关片段;分桶可用于进一步控制同一键的数据分布,减少洗牌和重复计算。装载阶段的分区策略直接影响后续性能与成本。
4.2.3 事务性/原子化加载思路
由于分布式系统可能出现部分写入成功的问题,工程上常采用原子化提交思路,例如先写入临时位置、完成后再切换到最终位置,或使用支持事务语义的写入机制。
4.3 性能与成本影响因素
4.3.1 并行度与批大小
并行度决定了写入与处理的并发能力;批大小影响任务调度与资源利用。过小会产生过多元数据与调度开销,过大则可能造成内存压力与失败重试成本上升。
4.3.2 索引/文件布局优化
装载后的文件组织(如大小、压缩、分区粒度)与索引策略(若存在)会影响查询读取范围与数据扫描量。合理布局可减少“扫全表”的概率。
4.3.3 资源弹性与调度
云环境中常利用弹性资源降低空转成本。调度策略与资源配额会影响峰值时段的处理速度,以及多任务并发时的相互影响。
5 ETL/ELT 架构与组件
5.1 管道编排(Orchestration)
5.1.1 任务调度与依赖管理
编排负责把抽取、转换、装载按依赖关系串联起来,支持多数据源、多阶段加工与并行分支。依赖管理确保前置任务完成后才触发后续步骤,避免数据缺口。
5.1.2 失败处理与重跑机制
当某一步失败时,需要明确重跑边界:是重跑整个作业还是仅重跑失败分区。良好的失败处理会记录输入范围与执行参数,从而让重跑可控且结果一致。
5.1.3 SLA/容错设计
SLA 决定最迟完成时间,容错设计则决定在部分失败、数据延迟或短期源不可用时的降级策略。例如允许使用上一次有效分区、或触发补偿回填任务。
5.2 数据处理引擎
5.2.1 传统批处理框架
传统批处理框架常用于稳定的定时装载与离线加工。优势是成熟、易于管理;劣势在于对复杂交互式分析或强弹性场景支持有限。
5.2.2 分布式计算(如 Spark 思路)
分布式计算适合处理大规模转换、复杂 join 与聚合。通过并行执行提升吞吐,但也需要关注数据倾斜、shuffle 成本与容错重算。
5.2.3 云端托管处理
云端托管服务降低运维负担,常提供自动扩缩容、托管调度与更友好的集成方式。选择时通常要评估供应商锁定、成本计量口径与性能可预测性。
5.3 元数据与目录
5.3.1 数据目录与资产管理
数据目录记录表、字段、分区、数据来源与用途等信息,帮助使用者快速理解资产状态,并支撑权限、下线与版本管理。
5.3.2 作业元数据与运行日志
运行日志与作业元数据用于追踪每次执行的参数、输入数据范围、运行耗时与质量结果。它们是排障与审计的重要依据。
5.4 监控与告警
5.4.1 指标体系(延迟、吞吐、错误率)
监控指标通常覆盖处理延迟(从源到目标的时间)、吞吐(处理速度)、错误率与重试次数等。对准实时或微批场景,延迟指标往往是最关键的信号。
5.4.2 告警策略
告警策略应区分异常与告警的严重程度,例如质量校验失败可触发阻断加载,性能指标异常则触发扩容或限流。告警也要避免噪声,减少无效通知带来的疲劳。
6 批处理与实时化(准实时)演进
6.1 批处理 ETL/ELT 的运行节奏
6.1.1 定时任务
定时任务按固定频率运行,例如每小时或每日。它适用于大多数离线分析需求,但对高波动实时性要求较弱。
6.1.2 触发式任务
触发式任务在特定事件发生后运行,例如新文件到达、消息积压达到阈值、或上游数据完成归档。相比纯定时,触发式任务更能贴合实际到达节奏。
6.2 流式与微批处理思路
6.2.1 近实时装载
近实时装载通常采用微批:把流数据按小时间窗或数量聚合后以批次方式写入,并在窗口内进行有限转换。这样兼顾流数据的时效和批处理的工程可控性。
6.2.2 事件时间与处理时间差异
流式系统中常同时存在事件时间与处理时间。事件时间用于业务语义排序,处理时间反映系统处理节奏。两者差异可能造成延迟、乱序与回补需求,需要在转换与窗口计算中明确采用哪一种时间基础。
6.3 实时场景下的权衡
6.3.1 延迟 vs 成本
实时化通常提高资源投入,因为需要更频繁的处理与更复杂的状态管理。工程上要在可接受延迟与可控成本之间做平衡。
6.3.2 乱序与回补机制
乱序事件会影响依赖事件序列的指标。常见做法是设置允许乱序窗口,在超过窗口后采用补偿作业或基于版本化结果回写历史分区。
7 选择 ETL 还是 ELT:决策指南
7.1 目标平台能力对比
7.1.1 云数仓的计算成本与并行执行
若目标平台具备强并行执行能力且计算成本可控,ELT 往往更容易利用平台优势完成转换。反之,如果计算成本偏高或资源隔离不足,ETL 可能更适合把转换负载卸载到专门计算环境。
7.1.2 数据湖的文件/分区策略
在湖或湖仓场景中,ELT 的落地与转换都要与文件组织策略协同。若分区设计与文件布局成熟,ELT 能更好发挥查询裁剪带来的效率。
7.2 转换复杂度与数据规模
7.2.1 复杂 SQL/视图下推
若转换逻辑主要由 SQL、视图或可在目标端优化的查询表达构成,ELT 往往更顺畅。因为转换可以直接在目标系统中统一优化执行计划。
7.2.2 资源占用与可扩展性
当数据规模很大、转换较重时,需要评估转换阶段的内存、shuffle、以及失败重算成本。ELT 依赖目标端可扩展性;ETL 则依赖外部计算集群的稳定性。
7.3 延迟要求与运维难度
7.3.1 运维与调试体验
ETL 的转换链路在外部环境更易被隔离观察,排障可能更直观;ELT 将转换集中到目标系统,运维上可能更集中,但调试需要理解目标系统的执行优化与资源调度特性。
7.3.2 可回滚与版本管理
无论 ETL 还是 ELT,都需要版本管理与回滚策略。ETL 可以在进入目标系统前控制输出;ELT 则需要确保转换逻辑版本、输入快照与目标表状态之间保持可追溯关系。
8 常见问题与最佳实践
8.1 幂等性与可重跑
幂等性是可维护性的底座。最佳实践包括:为目标写入设计唯一键或合并语义;记录输入批次范围与消费进度;在重跑时避免重复计数与重复创建分区。
8.2 数据契约与版本兼容
数据契约强调输入字段、类型、语义与质量约束的约定。版本兼容用于应对上游字段新增、类型变化或口径调整,避免每次变更都造成下游故障。通过契约与版本管理,可降低“改一处、坏一片”的风险。
8.3 分区裁剪与文件优化(避免“扫全表”)
当目标存储支持分区裁剪时,应尽量让写入与查询都遵循分区维度。与此同时,对文件大小、压缩与布局进行治理,减少小文件数量过多带来的元数据开销与扫描成本。
8.4 性能调优清单
8.4.1 并行读取与合并策略
并行读取需结合数据分布,避免单一分区或热点键导致倾斜。合并策略则要在减少 shuffle 与控制中间结果大小之间取得平衡。
8.4.2 统计信息与执行计划
查询优化高度依赖统计信息。实践中要定期更新统计信息、检查执行计划是否出现不合理的全表扫描与大规模重分发,并针对热点路径做针对性优化。
8.5 “ETL/ELT”轻度梗:从“清洗前置”到“清洗后置”的心路历程
有时工程师会经历这样的“心路历程”:一开始偏爱 ETL,因为“先把脏东西赶走,心里踏实”;后来切到 ELT,又发现“原来把清洗交给目标平台也能很快”,于是开始优化分区、调整文件布局、盯住成本与延迟指标。最后得出的结论通常是:不是谁更好,而是你把谁当主场。
9 安全、合规与访问控制
9.1 权限与最小授权
数据集成链路需要按角色与任务授予最小权限。常见做法包括:区分读取、写入与管理权限;对敏感数据表或字段单独授权;在作业运行时采用受控身份执行。
9.2 加密与脱敏
9.2.1 传输加密与存储加密
传输加密用于保护数据在网络中的传递安全;存储加密用于防止目标介质被离线访问时内容泄露。两者常与密钥管理体系一起落地。
9.2.2 字段级脱敏与掩码
字段级脱敏与掩码会在不影响分析的前提下降低敏感暴露,例如对身份证号、手机号或密钥类字段进行不可逆或可控可逆的处理。脱敏策略应与合规要求和使用场景保持一致。
9.3 审计与留痕
审计记录需要覆盖访问行为、数据变更、作业执行与质量结果。留痕能力有助于追责、风险评估与合规证明,也能在数据异常时快速定位责任链路。
10 参考实现与工具生态(概览)
10.1 常见开源与商业工具类别
工具生态覆盖多个环节:源端抽取连接、任务编排调度、分布式处理引擎、数据目录与元数据管理、以及质量校验与监控告警等。选择时通常考虑与目标平台的兼容性、可观测性、以及运维成本。
10.2 典型作业模板与示例流程
常见流程模板包括:
- 抽取:按分区或游标读取源数据,并落到暂存区。
- 转换:执行清洗、标准化、建模与质量校验。
- 装载:分区写入目标表或完成目录注册。
- 验证:行数对账、抽样校验、质量阈值检查。
- 记录:更新元数据、写入运行日志并触发告警或放行。
10.3 从 PoC 到生产化的落地步骤
从 PoC 到生产化通常需要补齐:稳定性(失败重试与回滚)、可维护性(可配置与参数化)、可观测性(监控与告警)、以及治理能力(元数据、血缘与数据质量)。同时要进行成本评估与压测,验证在规模增长时的可扩展性。
11 相关主题
11.1 数据仓库与湖仓一体
数据仓库与湖仓一体关注数据存储与查询的协同优化。ETL/ELT 的选择与实现往往与其分区、文件布局、计算能力和事务语义紧密相关。
11.2 数据治理与数据质量
数据治理强调制度与流程,数据质量强调可度量的结果。二者共同作用在 ETL/ELT 过程中,形成质量门禁、血缘追踪与持续改进机制。
11.3 数据血缘与可追溯性
血缘与追溯能力帮助定位转换链路中的问题来源,也用于评估口径变更对下游指标的影响范围。实现上通常需要在抽取、转换与装载阶段持续记录元数据。
11.4 流处理与事件驱动架构
流处理与事件驱动架构讨论如何把实时事件纳入数据流转。ETL/ELT 在准实时或实时化演进中会与这些架构结合,形成微批、回补与状态管理的工程实践。