最近我一直在玩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
有什么想法应该继续进行还是做错了什么?
答案 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)脚本中。如果是这样,我假设您使用BashOperator
来spark-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。