幂等性

幂等性强调的是外界通过接口对系统内部的影响, 外界怎么看系统和幂等性没有关系,只要一次或多次调用对某一个资源应该具有同样的副作用就行。注意了,是对资源造成的副作用必须是一样的,但是返回值允许不同!

参考: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过程变得更加灵活和便于维护。

参考:

模块化

将重复使用到的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)
  • 条件执行

参考: