幂等性
幂等性强调的是外界通过接口对系统内部的影响, 外界怎么看系统和幂等性没有关系,只要一次或多次调用对某一个资源应该具有同样的副作用就行。注意了,是对资源造成的副作用必须是一样的,但是返回值允许不同!
参考:https://cloud.tencent.com/developer/news/389770
ETL处理流程重复执行并不会给系统带来不一样的副作用。此时需要保证业务逻辑是一致的。
增量加载
可通过:
- 最近修改/更新时间
- 自增ID
来实现增量加载。
关于增量加载参考:https://www.astronomer.io/guides/dag-best-practices/
原子性
通俗讲,就是将复杂的问题拆解成更细小的执行单元。每个小的执行单元执行的是不同的任务。这样能够试开发和维护成本降低,也便于进行ETL测试。
关于原子性参考:https://www.timmitchell.net/post/2016/11/04/etl-atomicity/
分区/块抽取
通过对目标中摄取的数据进行分区,您可以并行化dag运行,避免对正在摄取的数据进行写锁定,并在读取相同数据时优化性能。它还将作为特定时刻数据在审计时的样子的历史快照。不再相关的分区可以存档并从数据库中删除。
参考:https://gtoonstra.github.io/etl-with-airflow/principles.html
使用临时表/中间存储
使用临时表能够有助于实现ETL过程的原子化和模块化,让ETL过程变得更加灵活和便于维护。
参考:
- https://www.astronomer.io/guides/dag-best-practices/
- https://www.timmitchell.net/post/2017/06/14/etl-staging-tables/
模块化
将重复使用到的ETL处理逻辑进行模块化处理,可以有效提高开发效率和降低维护成本。Airflow的设计就遵从了这一原则。
参考:
脏数据处理
参考:https://www.timmitchell.net/post/2017/02/16/managing-bad-data-in-etl/
保存血缘关系
通过保存源数据和处理过程的历史信息,有助于ETL测试,和进行数据恢复。
参考:https://www.timmitchell.net/post/2016/05/06/etl-data-lineage/
数据库审核测试
参考:https://www.timmitchell.net/post/2016/03/22/etl-auditing/
日志管理
参考:https://www.timmitchell.net/post/2016/03/14/etl-logging/
补充:Airflow DAG ETL最佳实践
- 静态开始时间(start_date)
- 可读性/简化DAG
- 使用重试(retries)
- 条件执行
参考: