从luigi切换到airflow

从luigi切换到airflow,airflow,luigi,Airflow,Luigi,我有一个相对简单的任务,从运行120万个文件开始,每个文件都有一个管道(中间产品保存的多个步骤)。我已经在luigi中实现了这一点:。我喜欢Luigi使用文件系统查看任务是否完成。 我还发现了一个实现,在这个实现中,我可以删除一个中间产品,管道将重新创建所有依赖的产品(因此我可以更改管道)。 我该如何在气流中做到这一点(或者我应该坚持使用Luigi?)我真的不知道Luigi是如何工作的。我主要使用Apache气流。气流是一个工作流管理系统。这意味着它不会传输数据、转换数据或生成一些数据(尽管它会

我有一个相对简单的任务,从运行120万个文件开始,每个文件都有一个管道(中间产品保存的多个步骤)。我已经在luigi中实现了这一点:。我喜欢Luigi使用文件系统查看任务是否完成。 我还发现了一个实现,在这个实现中,我可以删除一个中间产品,管道将重新创建所有依赖的产品(因此我可以更改管道)。
我该如何在气流中做到这一点(或者我应该坚持使用Luigi?)

我真的不知道Luigi是如何工作的。我主要使用Apache气流。气流是一个工作流管理系统。这意味着它不会传输数据、转换数据或生成一些数据(尽管它会生成日志,并且有一个称为
Xcom
的概念,它允许在任务之间交换消息,允许更细微的控制形式和共享状态),例如Apache Nifi。但是它定义了您使用
操作符
实例化的每个任务的依赖项,例如
操作符
。为了知道任务是否完成,它检查同一任务返回的信号

下面是一个在气流中实现的示例

from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
import glob
import gzip
import shutil

args = {
    'owner': 'airflow',
    'start_date': airflow.utils.dates.days_ago(2)
}

dag = DAG(
    dag_id='example_dag', default_args=args,
    schedule_interval='0 0 * * *',
    dagrun_timeout=timedelta(minutes=60))


def extract_gzs():
    for filename in glob.glob('/1002/*.gz')
        with gzip.open(filename, 'rb') as f_in, open(filename[:-3], 'wb') as f_out:
            shutil.copyfileobj(f_in, f_out)


extractGZ = PythonOperator(
    task_id='extract_gz',
    provide_context=True,
    python_callable=extract_gzs(),
dag=dag)


cmd_cmd="""
your sed script!
"""

sed_script = BashOperator(
    task_id='sed_script', 
    bash_command=cmd_cmd, 
    dag=dag)


extractGZ.set_downstream(sed_script)
  • 导入要在气流中使用的操作符(当然,如果需要其他类/库,也要导入)
  • 定义你的Dag。在变量
    args
    中,我定义了
    owner
    start\u date
    参数
  • 然后实例化你的DAG。在这里,我将其命名为example_dag,并将其定义变量、schedule_interval和超时时间(根据您的需要,还有更多参数可供使用)
  • 创建了一个python函数extract_gzs()
  • 实例化了一个
    PythonOperator
    ,在这里我调用python函数
  • 对bash代码执行相同的操作
  • 确定两个任务之间的依赖关系
  • 当然,有更多的方法来实现同样的想法。根据需要进行调整!
    PS:有一些Apache Airflow的例子

    也许,我误解了整个管道的事情。我假设您构建一个管道,然后向它提供一个数据集,然后沿着管道的线路进行转换。这意味着一条管道可以处理120万个文件。这不是思考这个问题的正确方式吗。制作一个在文件上运行sed的气流管道,然后将其应用于120万个文件,这应该很简单,不是吗?@WolfgangKerzendorf检查我修改的答案。谢谢,我会尝试一下。这还不完全是我想象的那样。我想为一个文件构建一个管道,然后以某种方式使每个文件通过这个东西。