将气流变量导入PySpark
最近我一直在玩气流和Pypark。我看到气流有很多变量。我的目标是解析其中一个变量,并将其导入我的pySpark脚本。到目前为止,我试图回显变量的值,但是,我找不到导入到pyspark的方法。我想将该变量的值传递到pyspark脚本中的另一个变量。我还附加了我的代码job\u id,这是我所说的变量将气流变量导入PySpark,pyspark,airflow,apache-airflow-xcom,Pyspark,Airflow,Apache Airflow Xcom,最近我一直在玩气流和Pypark。我看到气流有很多变量。我的目标是解析其中一个变量,并将其导入我的pySpark脚本。到目前为止,我试图回显变量的值,但是,我找不到导入到pyspark的方法。我想将该变量的值传递到pyspark脚本中的另一个变量。我还附加了我的代码job\u id,这是我所说的变量 test_bash = """ export un_id={{ti.job_id}} echo $un_id """ bash_task = BashOperator( task_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
你知道我该怎么做,或者我做错了什么吗?这个值实际上叫做run\u id,可以通过上下文或宏访问 在Pythonoperator中,这是通过上下文访问的,在bash操作符中,这是通过bash_命令字段上的jinja模板访问的 有关宏中可用内容的详细信息: 有关jinja的更多信息:
以这个dag为例,检查每个操作员的日志,您应该会看到日志中打印的run_id。我没有尝试@kaxil建议的方法,但如果我理解并更正您的问题,您希望从Airflow中检索run_id变量,并在python pySpark脚本中使用它。如果是这样的话,我假设您使用BashOperator来spark提交作业。提交spark作业时,您可以随作业一起提交。这些参数显示为系统参数,如果执行printsys.argv,您可以看到这些参数,这有助于查看变量在哪个位置。 因为您已经用bash_任务推送了变量,所以必须拉取它。因此,当您提交spark作业时,还应添加以下额外参数:
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)
然后,如果您确实执行了printsys.argv,您将能够看到变量作为参数,并且在脚本中,如果变量位于第二个位置,您可以通过sys.argv[1]引用该变量;如果变量位于第一个位置,则可以通过0引用该变量。谢谢,它正在工作!还有一件事我想问你,为了在我的pySpark脚本中检索run_id,我是否必须像导入系统变量一样遵循这个过程?或者有没有一种特殊的方法来检索和引用该变量?很高兴它起到了作用,您能否接受这个答案,以便将来遇到这个问题的用户知道:关于在PySpark脚本中导入run_id,取决于您运行的操作符。如果您使用BashOperator,您可以在脚本中使用{{run_id}}以同样的方式使用它。我仍在努力导入。我假设它是一个env变量,但显然不是。我还尝试了在您提供的链接中找到的方法:testing={run\u id}bash\u task=bash operator task\u id='bash\u run\u id',bash\u command='echo{{run\u id}',bash\u command='tmp/myfile.py',provide\u context=True,dag=dag,env={UNIQUE\u id':testing},但它也不起作用。我无法理解我遗漏了什么。嘿,不,你应该使用PythonOperator来运行那个文件,然后它就可以工作了。如果要使用bash操作符,则需要使用bash脚本,例如bash_command=run_pyspark.sh。您的run_pyspark.sh可以将第一行作为export RUNID={{run_id};python tmp/myfile.py,在python文件中,您可以通过os.environ[RUNID]使用它
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)