将气流变量导入PySpark

时间:2018-12-12 10:06:09

标签: pyspark airflow apache-airflow-xcom

最近我一直在玩Airflow和PySpark。我看到Airflow有很多变量。我的目的是解析这些变量之一,并将其​​导入到我的pySpark脚本中。到目前为止,我试图回显变量的值(有效),但是然后,我找不到导入pySpark的方法(我想将该变量的值传递给pyspark脚本中的另一个变量)。我还附加了我的代码(job_id是我正在谈论的变量)。

test_bash = """
export un_id={{ti.job_id}}
echo $un_id
"""

bash_task = BashOperator(
    task_id='test',
    bash_command=test_bash,
    xcom_push=True,
    provide_context=True,
    dag=dag)

def pull_function(**kwargs):
    ti = kwargs['ti']
    rt = ti.xcom_pull(task_ids='test')
    print(rt)

pull_task = PythonOperator(
    task_id='pull_task',
    python_callable=pull_function,
    provide_context=True,
    dag=dag
)

#############
bash_task >> pull_task

有什么想法应该继续进行还是做错了什么?

2 个答案:

答案 0 :(得分:0)

该值实际上称为run_id,可以通过上下文或宏进行访问。

Pythonoperator中,这是通过上下文访问的;在BashOperator中,这是通过模板模板的bash_command来访问的。

有关宏中可用内容的更多信息:

https://airflow.incubator.apache.org/code.html#macros

有关神社的更多信息:

https://airflow.incubator.apache.org/concepts.html#jinja-templating

from airflow.models import DAG
from datetime import datetime
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator


dag = DAG(
    dag_id='run_id',
    schedule_interval=None,
    start_date=datetime(2017, 2, 26)
)

def my_func(**kwargs):
    context = kwargs
    print(context['dag_run'].run_id)

t1 = PythonOperator(
    task_id='python_run_id',
    python_callable=my_func,
    provide_context=True,
    dag=dag
    )

t2 = BashOperator(
    task_id='bash_run_id',
    bash_command='echo {{run_id}}',
    dag=dag)

t1.set_downstream(t2)

以这个dag为例,检查每个操作员的日志,您应该看到日志中印有run_id

答案 1 :(得分:0)

我还没有尝试@kaxil的建议,但是如果我理解正确的问题,则希望从Airflow检索run_id变量并将其用于python(pySpark)脚本中。如果是这样,我假设您使用BashOperatorspark-submit做您的工作。提交即时职位时,您可以提交some arguments(以及工作)。这些参数作为系统参数显示,如果您执行print(sys.argv),则可以看到它们(可以用来查看变量在哪个位置)。 由于您已经使用bash_task推送了变量,因此必须将其提取。因此,当您提交火花作业时,还应该添加一个额外的参数,例如:

cmd=""spark-submit your-pyspark-file.py {{ ti.xcom_pull("test") }}

retrieval = BashOperator(
    namespace='randomname',
    arguments=[cmd],
    name='example-dag1',
    task_id='name-you-desire',
    provide_context=True,
    get_logs=True, 
    dag=dag)

然后,如果您确实执行了print(sys.argv),您将能够看到变量作为参数,并且可以在脚本中通过sys.argv[1]引用该变量(如果它位于第二位置) ,如果是第一个,则为0。