20181007 ETL 使用脚本处理存在的问题

之前遗留项目的 ETL 流程大量使用 bash 脚本,现在的项目则因为处理逻辑复杂,重新用 Python 编写。两者都是定时触发,长期维护发现存在以下问题:

  • 每个任务分散在各个不同的目录中,调试更改困难
  • 有时多个任务可并行减少时间,但是只能使用 &wait $PID 来进行
  • 任务失败无法快速找到断点,所以在接手之后根据整个流程写了一个检测脚本
  • 找到断点后,想要执行后面所有的任务,则需要创建一个主流程副本,删掉前面的已成功任务的代码再执行
  • 不知道任务执行到哪一步了,除非看 hadoop、spark history 和 hdfs 路径是否有文件生成或使用检测脚本
  • 新人学习 ETL 流程时,只能阅读脚本然后手动画出整个过程,才能有直观上的理解;但流程图的每一步没有与代码直接对应
  • 但如果采用手工绘制流程图,则更新代码后,流程图不能保证同步更新
  • 一个大任务的日志一般在一个文件中,导致每个小任务日志混杂,难以排查
  • 增加、暂停单个子任务需要直接更新主流程脚本
  • 本地使用临时文件作为任务锁,防止任务重复执行
  • bash 脚本时使用本地文件记录已执行日期,其实是当作简单的数据库;Python 中则使用 sqlite 进行简单记录
  • 统计任务时间困难,要不根据日志,要不在代码中加上统计时间代码

最近受到 Azkaban 等任务调度系统启发,经调研决定使用 Airflow 来进行任务调度,尝试解决上面各种问题。