气流“ python运算符”将文件写入不同位置

时间:2018-08-07 20:29:08

标签: airflow

我在我的 dags / 文件夹下创建了一个 python_scripts / 文件夹。 我有2个不同的dag运行相同的python_operator-调用位于 python_scripts / 文件夹中的2个不同的python脚本。 他们都写输出文件,但是:

其中之一在 dags / 文件夹下创建文件,而其中之一在 plugins / 文件夹中创建文件。

气流如何确定工作路径? 如何让Airflow将所有输出写入同一文件夹?

1 个答案:

答案 0 :(得分:2)

您可以尝试做的一件事,就是在DAG中添加os.chdir('some/path')来设置工作路径。

仅当您不将其放入运算符中时才有效,因为它们在子流程中运行,因此不会更改父流程的工作路径。

我想到的另一种解决方案是在指定输出时使用绝对路径。

对于使用os.chdir的方法,请尝试以下操作,您应该看到两个文件都在用path='/home/chr/test/'定义的文件夹中创建:

from datetime import datetime
import os
import logging
from airflow import DAG
from airflow.exceptions import AirflowException
from airflow.operators.python_operator import PythonOperator

log = logging.getLogger(__name__)

default_args = {
    'owner': 'admin',
    'depends_on_past': False,
    'retries': 0
}

dag = DAG('test_dag',
          description='Test DAG',
          catchup=False,
          schedule_interval='0 0 * * *',
          default_args=default_args,
          start_date=datetime(2018, 8, 8))

path = '/home/chr/test'

if os.path.isdir(path):
    os.chdir(path)
else:
    os.mkdir(path)
    os.chdir(path)


def write_some_file():
    try:
        with open("/home/chr/test/absolute_testfile.txt", "wt") as fout:
            fout.write('test1\n')
        with open("relative_testfile.txt", "wt") as fout:
            fout.write('test2\n')
    except Exception as e:
        log.error(e)
        raise AirflowException(e)


write_file_task = PythonOperator(
    task_id='write_some_file',
    python_callable=write_some_file,
    dag=dag
) 

此外,请在下次问问题时尝试提供代码,因为仅通过阅读问题就几乎不可能找出问题所在。