Pyspark 将变量从火花推至气流

Pyspark 将变量从火花推至气流,pyspark,airflow,apache-airflow-xcom,Pyspark,Airflow,Apache Airflow Xcom,我有一个变量,我想把它的值推送到气流,这样我就可以把它作为下一个任务的输入。我知道我必须使用XCOM,但我还没有弄清楚如何从火花任务推进到气流 def c_count(): return spark_task( name='c_count', script='c_count.py', dag=dag, table=None, host=Variable.get('host'), trigger

我有一个变量,我想把它的值推送到气流,这样我就可以把它作为下一个任务的输入。我知道我必须使用XCOM,但我还没有弄清楚如何从火花任务推进到气流

def c_count():
    return spark_task(
        name='c_count',
        script='c_count.py',
        dag=dag,
        table=None,
        host=Variable.get('host'),
        trigger_rule="all_done",
        provide_context=True,
        xcom_push = True
    )





 def c_int():
        return spark_task(
            name='c_in',
            script='another_test.py',
            dag=dag,
            table=None,
            host=Variable.get('host'),
            trigger_rule="all_done",
            counts="{{ task_instance.xcom_pull(task_ids='c_count') }}"
        )
编辑: spark任务如下所示:

def spark_task_sapbw(name, script, dag, table, host, **kwargs):

    spark_cmd = 'spark-submit'

    if Variable.get('spark_master_uri', None):
        spark_cmd += ' --master {}'.format(Variable.get('spark_master_uri'))
.
.
.


    task = BashOperator(
        task_id=name,
        bash_command=spark_cmd,
        dag=dag,
        **kwargs
    )
    return task

问题是我得到的是气流日志的最后一次打印。是否有任何方法可以从spark脚本中获取特定值?谢谢大家!

您无法使火花和气流直接通信。您必须在两者之间使用Python。您需要的值,并使用XCOM将其推送到气流

您无法使火花和气流直接通信。您必须在两者之间使用Python。您需要的值,并使用XCOM将其推送到气流

您必须在此处提供更多信息:“spark_任务”映射到哪个气流操作员。另外,Airflow使用哪个执行器?您可以将Airflow任务之间的数据持久化到诸如redis cache之类的键/值存储中。从RDD收集spark驱动程序中的数据并存储到redis store中。内部气流DAG连接到redis store并获取存储的参数。在气流中的下一个所需任务中使用它。另一方面,如果您的airflow服务器在您提交spark驱动程序的同一节点上运行,则您可以在收集后写入文件,并在下一个airflow任务中再次读取文件。您必须在此处提供更多信息:“spark_任务”映射到哪个airflow操作员。另外,Airflow使用哪个执行器?您可以将Airflow任务之间的数据持久化到诸如redis cache之类的键/值存储中。从RDD收集spark驱动程序中的数据并存储到redis store中。内部气流DAG连接到redis store并获取存储的参数。在气流中的下一个所需任务中使用它。另一方面,如果您的airflow服务器运行在您提交spark驱动程序的同一个节点上,那么您只需在收集后写入文件,然后在下一个airflow任务中再次读取该文件,这正是我所担心的!谢谢大家!@MichaelGerm您的主要问题是您将pyspark与bash命令一起使用。Airflow是python中的,因此您应该包括spark包,并使用python操作符使pyspark代码直接在Airflow中运行。这将更容易传输任何想要的数据。正是我所害怕的!谢谢大家!@MichaelGerm您的主要问题是您将pyspark与bash命令一起使用。Airflow是python中的,因此您应该包括spark包,并使用python操作符使pyspark代码直接在Airflow中运行。这样更容易传输任何想要的数据。