使用真实脚本实现Airflow

时间:2017-03-13 19:07:30

标签: airflow

我成功设置了Airflow服务器。我想运行一些测试工作,但我很难找到适合我想做的初学者指南。

现状:

  • 用于从SFTP下载文件的Python脚本(本地计算机上不存在的任何文件)或从查询输出创建文件
  • Pandas脚本将数据读入内存,以某种方式修改它以为数据库做准备(查找新维度,重新映射,添加计算)。将数据加载到数据库中的相应表。发送电子邮件摘要(pandas to_html)

我对大多数脚本的逻辑基于文件是否尚未处理,然后处理它。 “已处理”文件或者按照db表中的文件名进行组织,或者将文件移动到特殊的已处理文件夹。

我的其他逻辑基于文件名中的日期。我比较了存在的文件的日期与应该存在的日期(日期范围)。如果该文件不存在,那么我创建它(通常是BCP或PSQL查询)。

我只是让Airflow运行这些.py文件吗?或者我应该改变我的脚本以使用一些Airflow参数/ jinja模板?

我几乎觉得我几乎可以使用BashOperator。这会有用吗

dag_input = sys.argv[1]

def alter_table(query, engine=pg_engine):
    fake_conn = engine.raw_connection()
    fake_cur = fake_conn.cursor()
    fake_cur.execute(query)
    fake_conn.commit()
    fake_cur.close()

query_list = [
              f'SELECT * from table_1 where report_date = \'{dag_input}\'',
              f'SELECT * from table_2 where report_date = \'{dag_input}\'',
]

for value in query_list:
    alter_table(value)

然后dag会是这样的,有一个用于sys.argv的气流参数?

templated_command = """
        python download_raw.py "{{ ds }}"
"""

t3 = BashOperator(
    task_id='download_raw',
    bash_command=templated_command,
    dag=dag)

1 个答案:

答案 0 :(得分:2)

由于此任务的代码是在python中,我将使用PythonOperator。

在download_raw.py中添加一个方法,该方法将** kwargs作为参数,您可以访问上下文中的所有内容。

from download_raw import my_func

t3 = PythonOperator(
    task_id='download_raw',
    python_callable=my_func,
    dag=dag)


#inside download_raw.py

def my_func(**kwargs):
    context = kwargs
    ds = context['ds']
    ... (do your logic here)

我会这样做,或者你的bash命令在上下文的几个部分时会变得可怕。