一个非常好用的data pipeline管理工具 airflow

什么是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设计主导有关)。话不多说,先放两张截图:


Paste_Image.png

Screen-Shot-2015-06-02-at-10.09.23-AM.png

什么是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 was 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 里调整顺序就行了

如何运行

摘自官方网站

# 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

然后你就可以上web ui查看所有的dags,来监控你的进程。

如何导入dag

一般第一次运行之后,airflow会在默认文件夹下生成airflow文件夹,然后你只要在里面新建一个文件dag就可以了。我这边部署在阿里云上的文件tree大概是这个样子的。


Paste_Image.png

以下是我自己写的我们公司prettyyes里需要每天处理log的其中一个小的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
)

写好之后,只要将这个dag放入之前建立好的dag文件夹,然后运行:

python <dag_file>

来确保没有语法错误。在测试里你可以看到我的

schedule_interval=timedelta(days=1)

这样我们的数据处理的任务就相当于每天跑一次。更重要的是,airflow还提供处理bash处理的接口外还有hadoop的很多接口。可以为以后连接hadoop系统提供便利。很多具体的功能可以看官方文档。

其中的一个小的bug

airflow 1.6.1有一个网站的小的bug,安装成功后,点击dag里的log会出现以下页面:


Paste_Image.png

这个只要将

airflow/www/utils.py

文件替换成最新的airflow github上的utils.py文件就行,具体的问题在这个:

fixes datetime issue when persisting logs

使用supervisord进行deamon

airflow本身没有deamon模式,所以直接用supervisord就ok了,我们只要写4行代码。

[program:airflow_web]
command=/home/kimi/env/athena/bin/airflow webserver -p 8080

[program:airflow_scheduler]
command=/home/kimi/env/athena/bin/airflow scheduler

我觉得airflow特别适合小的团队,他的功能强大,而且真的部署方便。和hadoop,mrjob又可以无缝连接,对我们的业务有很大的提升。

Prettyyes 不以貌取人最肤浅



文/yin1941(简书作者)
原文链接:http://www.jianshu.com/p/59d69981658a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
<think>嗯,用户想用Python实现一个类似Kettle的数据处理工具。首先,我得弄清楚Kettle的主要功能是什么。Kettle,也就是Pentaho Data Integration,主要用于ETL(提取、转换、加载)。所以用户可能需要一个能够从不同数据源提取数据,进行转换处理,然后加载到目标位置的工具。 接下来,我需要考虑Python有哪些库可以支持这些功能。数据提取部分可能需要处理各种数据源,比如数据库、CSV、Excel等。Python有丰富的库,比如pandas可以处理CSV和Excel,SQLAlchemy或psycopg2可以连接数据库。转换部分的话,pandas的数据处理功能很强大,可以完成过滤、合并、聚合等操作。加载部分可能需要将处理后的数据导出到文件或数据库,同样可以用pandas和对应的数据库驱动。 然后,用户可能需要一个可视化界面或者至少是配置化的流程,这样不用写太多代码。但Python在这方面可能不如Kettle的图形化界面方便,可能需要用Flask或Django做个简单的Web界面,或者用配置文件(如JSON、YAML)来定义流程。 还要考虑任务调度,比如定期执行ETL任务。可以用APScheduler或者Airflow,但Airflow可能对于简单需求来说有点重。APScheduler可能更轻量级。 接下来,我需要分步骤思考如何构建这样一个工具。首先,设计数据处理流程的结构,可能包括读取、转换、加载的步骤,每个步骤对应一个类或函数。然后实现各个数据连接器,比如读取CSV、数据库等。转换部分需要支持常见的操作,比如过滤、映射、合并等。加载部分需要支持写入不同目标。 然后,错误处理和日志记录也很重要,确保流程中的问题能被及时发现和处理。可能用Python的logging模块,并在每个步骤中加入异常捕获。 用户可能希望工具具有扩展性,允许添加新的数据源或转换操作。这可以通过插件模式实现,定义接口,让用户自行扩展。 最后,测试和优化性能,尤其是处理大数据时的效率问题。pandas在处理大数据时可能内存不足,可能需要分块处理或者使用Dask这样的库。 总结下来,实现这样一个工具需要结合Python的数据处理库,设计模块化的结构,处理多数据源,实现常用转换操作,并考虑任务调度和错误处理。可能还需要简单的配置方式或界面来提高易用性。</think>我将分步骤为您介绍如何使用Python构建一个轻量级ETL工具,并附关键技术实现示例: 1. **核心架构设计** ```python class ETLPipeline: def __init__(self): self.steps = [] def add_step(self, step): self.steps.append(step) def execute(self): data = None for step in self.steps: data = step.process(data) ``` 2. **数据连接器实现** ```python # CSV读取器示例 import pandas as pd class CSVExtractor: def __init__(self, file_path): self.file_path = file_path def process(self, _): return pd.read_csv(self.file_path) # 数据库连接器示例(使用SQLAlchemy) from sqlalchemy import create_engine class DBLoader: def __init__(self, conn_str, table_name): self.engine = create_engine(conn_str) self.table = table_name def process(self, data): data.to_sql(self.table, self.engine, if_exists='append') return data ``` 3. **常用转换操作** ```python # 数据清洗转换器 class DataCleaner: def __init__(self, columns_to_drop): self.columns = columns_to_drop def process(self, data): return data.drop(columns=self.columns) # 字段计算转换器 class FieldCalculator: def __init__(self, new_field, formula): self.new_field = new_field self.formula = formula # 例如 "df['a'] + df['b']" def process(self, data): data[self.new_field] = eval(self.formula) return data ``` 4. **流程配置化(JSON示例)** ```json { "pipeline": [ { "type": "extract", "subtype": "csv", "path": "input.csv" }, { "type": "transform", "action": "filter", "condition": "age > 18" }, { "type": "load", "target": "database", "connection": "postgresql://user:pass@localhost/db", "table": "users" } ] } ``` 5. **扩展功能实现** - **错误处理机制** ```python class ErrorHandler: def __init__(self, error_threshold=0.05): self.threshold = error_threshold def validate(self, data): error_rate = data.isnull().mean().mean() if error_rate > self.threshold: raise ETLException(f"数据错误率超过阈值:{error_rate}") ``` - **任务调度(使用APScheduler)** ```python from apscheduler.schedulers.background import BackgroundScheduler scheduler = BackgroundScheduler() scheduler.add_job(pipeline.execute, 'cron', hour=2) scheduler.start() ``` **关键优化方向**: 1. 大数据处理:使用Dask替代Pandas处理超过内存的数据集 ```python import dask.dataframe as dd class BigCSVExtractor: def process(self, _): return dd.read_csv(self.file_path) ``` 2. 可视化配置(使用Streamlit快速搭建界面) ```python import streamlit as st def build_ui(): st.sidebar.title("ETL配置") source_type = st.sidebar.selectbox("数据源类型", ["CSV", "Database"]) # 更多配置项... ``` 3. 性能监控 ```python from prometheus_client import start_http_server, Summary PROCESS_TIME = Summary('etl_processing_seconds', 'Time spent processing') @PROCESS_TIME.time() def execute_pipeline(): # 执行流程... ``` **完整示例流程**: ```python # 创建ETL流程 pipeline = ETLPipeline() pipeline.add_step(CSVExtractor("input.csv")) pipeline.add_step(DataCleaner(['unused_column'])) pipeline.add_step(FieldCalculator('full_name', "df['first_name'] + ' ' + df['last_name']")) pipeline.add_step(DBLoader("postgresql://user:pass@localhost/db", "output_table")) # 执行流程 try: pipeline.execute() except ETLException as e: send_alert(f"ETL流程失败:{str(e)}") ``` **推荐技术栈组合**: - 核心处理:Pandas/Dask + SQLAlchemy - 工作流调度:Apache Airflow/Luigi - 可视化:Streamlit/Dash - 分布式处理:PySpark - 数据质量校验:Great Expectations 实际开发中需要根据具体需求选择组件,建议从简单核心功能开始逐步扩展。对于企业级应用,推荐使用现成的开源方案如Apache Hop(原Kettle的Python实现)或Mara Pipeline
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值