最近在 Prettyyes 一直想建立起非常专业的 data pipeline 系统,然后没有很多时间,这几个礼拜正好 app 上线,有时间开始建立自己的 data pipeline,能够很好的做每天的数据导入,数据收集,以及数据分析。
什么是 ETL
ETL 是常用的数据处理,在以前的公司里,ETL 差不多是数据处理的基础,要求非常稳定,容错率高,而且能够很好的监控。ETL的全称是 Extract,Transform,Load, 一般情况下是将乱七八糟的数据进行预处理,然后放到储存空间上。可以是 SQL 的也可以是 NOSQL 的,还可以直接存成 file 的模式。
一开始我的设计思路是,用几个 cron job 和 celery 来 handle 所有的处理,然后将我们的 log 文件存在 hdfs,还有一些数据存在 mysql,大概每天跑一次。核心是能够 scale,稳定,容错,roll back。我们的 data warehouse 就放在云上,就简单处理了。
有了自己的 ETL 系统我觉得就很安心了,以后能够做数据处理和机器学习方面就相对方便一些。
问题来了
一开始我设计的思路和 Uber 一开始的 ETL 很像,因为我觉得很方便。但是我发觉一个很严重的问题,我一个人忙不过来。首先,要至少写个前端 UI 来监控 cron job,但是市面上的都很差。其次,容错的 autorestart 写起来很费劲,可能是我自己没有找到一个好的处理方法。最后部署的时候相当麻烦,如果要写好这些东西,我一个人的话要至少一个月的时间,可能还不是特别 robust。在尝试写了 2 两天的一些碎片处理的脚本之后我发觉时间拖了实在太久了。
隆重推荐的工具
airbnb 是我很喜欢的公司,他们有很多开源的工具,airflow 我觉得是最实用的代表。airflow 是能进行数据 pipeline 的管理,甚至是可以当做更高级的 cron job 来使用。现在一般的大厂都说自己的数据处理是 ETL,美其名曰 data pipeline,可能跟 google 倡导的有关。airbnb 的 airflow 是用 python 写的,它能进行工作流的调度,提供更可靠的流程,而且它还有自带的UI(可能是跟airbnb设计主导有关)。话不多说,先放两张截图:
什么是 DAG
airflow 里最重要的一个概念是 DAG。
DAG 是 directed asyclic graph,在很多机器学习里有应用,也就是所谓的有向非循环。但是在 airflow 里你可以看做是一个小的工程,小的流程,因为每个小的工程里可以有很多“有向”的 task,最终达到某种目的。在官网中的介绍里说 dag 的特点:
Scheduled: each job should run at a certain scheduled interval
Mission critical: if some of the jobs aren’t running, we are in trouble
Evolving: as the company and the data team matures, so does the data processing
Heterogenous: the stack for modern analytics is changing quickly, and most companies run multiple systems that need to be glued together
YEAH! It's awesome, right? After reading all of these, I found it's perfectly fit Prettyyes.
如何安装
安装 airflow 超级简单,使用 pip 就可以,现在 airflow 的版本是 1.6.1,但是有个小的 bug,这个之后会告诉大家如何修改。pip install airflow这里有个坑,因为 airflow 涉及到很到数据处理的包,所以会安装 pandas 和 numpy(这个 Data Scientist 应该都很熟悉)但是国内pip install 安装非常慢,用 douban 的源也有一些小的问题。我的解决方案是,直接先用豆瓣的源安装 numpy 和 pandas,然后再安装 airflow,自动化部署的时候可以在 requirements.txt 里调整顺序就行了
如何运行
摘自官方网站然后你就可以上 web ui 查看所有的 dags,来监控你的进程。# airflow needs a home, ~/airflow is the default,
# but you can lay foundation somewhere else if you prefer
# (optional)
export AIRFLOW_HOME=~/airflow
# install from pypi using pip
pip install airflow
# initialize the database
airflow initdb
# start the web server, default port is 8080
airflow webserver -p 8080
如何导入dag
一般第一次运行之后,airflow 会在默认文件夹下生成 airflow 文件夹,然后你只要在里面新建一个文件 dag 就可以了。我这边部署在阿里云上的文件 tree 大概是这个样子的。
以下是我自己写的我们公司 prettyyes 里需要每天处理 log 的其中一个小的 dag:写好之后,只要将这个 dag 放入之前建立好的 dag 文件夹,然后运行:from airflow import DAG
from airflow.operators import BashOperator
from datetime import datetime, timedelta
import ConfigParser config = ConfigParser.ConfigParser() config.read('/etc/conf.ini') WORK_DIR = config.get('dir_conf', 'work_dir') OUTPUT_DIR = config.get('dir_conf', 'log_output') PYTHON_ENV = config.get('dir_conf', 'python_env') default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime.today() - timedelta(days=1),
'retries': 2,
'retry_delay': timedelta(minutes=15), } dag = DAG('daily_process', default_args=default_args, schedule_interval=timedelta(days=1)) templated_command = "echo 'single' | {python_env}/python {work_dir}/mr/LogMR.py"\ .format(python_env=PYTHON_ENV, work_dir=WORK_DIR) + " --start_date {{ ds }}"
task = BashOperator(
task_id='process_log', bash_command=templated_command, dag=dag )python <dag_file>来确保没有语法错误。在测试里你可以看到我的schedule_interval=timedelta(days=1)这样我们的数据处理的任务就相当于每天跑一次。更重要的是,airflow 还提供处理 bash 处理的接口外还有 hadoop 的很多接口。可以为以后连接 hadoop 系统提供便利。很多具体的功能可以看官方文档。
其中的一个小的 bug
airflow 1.6.1 有一个网站的小的 bug,安装成功后,点击 dag 里的 log 会出现以下页面:
这个只要将airflow/www/utils.py文件替换成最新的 airflow github 上的 utils.py 文件就行,具体的问题在这个:
fixes datetime issue when persisting logs
使用 supervisord 进行 deamon
airflow 本身没有 deamon 模式,所以直接用 supervisord 就 ok 了,我们只要写 4 行代码。我觉得 airflow 特别适合小的团队,他的功能强大,而且真的部署方便。和 hadoop,mrjob 又可以无缝连接,对我们的业务有很大的提升。[program:airflow_web] command=/home/kimi/env/athena/bin/airflow webserver -p 8080
[program:airflow_scheduler] command=/home/kimi/env/athena/bin/airflow scheduler
-EOF-
专业的开发者技术社区
多样化线上知识交流
丰富线下活动和给力工作机会