Google cloud platform DAG不接受参数化消息

Google cloud platform DAG不接受参数化消息,google-cloud-platform,airflow,google-cloud-pubsub,Google Cloud Platform,Airflow,Google Cloud Pubsub,我有一个DAG,它需要执行Python操作符,并将结果字符串作为消息传递给PubsubPublish操作符 下面的代码完美地打印了信息,但当我将此DAG上传到airflow时,它无法加载。我认为这是我的DAG的结构,pubsubpublish操作符无法读取参数“messages” 我尝试使用消息作为模板字段,但也没有帮助 def download_yaml(): storage_client = storage.Client() bucket = storage_client.get_bucke

我有一个DAG,它需要执行Python操作符,并将结果字符串作为消息传递给PubsubPublish操作符

下面的代码完美地打印了信息,但当我将此DAG上传到airflow时,它无法加载。我认为这是我的DAG的结构,pubsubpublish操作符无法读取参数“messages”

我尝试使用消息作为模板字段,但也没有帮助

def download_yaml():
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.blob(source_blob_name)
content_blob=blob.download_as_string()
encoded_string = base64.b64encode(content_blob)
return encoded_string

encoded_string = download_yaml()
messages = [
     {'data': b64encode(encoded_string)},

] 
print messages
dag= DAG('pubsub-message-docker', default_args=default_args,schedule_interval=timedelta(days=1))
t2 = PubSubPublishOperator(project=project,topic=topic,task_id='publish-messages', messages=messages,dag=dag)

t1= PythonOperator(task_id='download_yaml_as_string',provide_context=True,python_callable=download_yaml,dag=dag)

t1.set_downstream(t2)

我可以打印“编码字符串”,但是我需要将编码字符串作为消息传递给我的pubsubpublish操作符,以便将其发布。

如果您在UI中看到DAG,但收到您在注释中提到的错误(主计划程序不知道其存在),然后我建议先快速查看一下调度程序!确保计划程序可以访问您的DAG,然后尝试重新启动计划程序。当你犯了那个错误。。。您将在web UI中看到DAG,但无法运行或查看其日志


至于你关于向PubsSubpublisheperator传递消息的另一个问题,我相信这应该很好 XCOM允许任务交换消息,允许更细微的形式 控制和共享状态。这个名字是的缩写 “交叉沟通”。。。。。。任何物体 可以作为XCom值使用,所以用户应该确保 使用适当大小的对象

XCOM可以“推送”(发送)或“拉送”(接收)

任务调用xcom\u pull()来检索xcom,可以选择应用过滤器 基于密钥、源任务id和源dag id等标准

  • 您可以运行python文件并获得未知结果,因为消息与任务t1没有关系。它只是在开始时通过函数download\u yml初始化的。虽然t1再次呼叫下载_yml,但没有更改消息。因此,T2只获取具有初始值的消息。要解决这个问题,您必须将t1中的消息推送到Xcom,并从Xcom中提取t2中的消息
  • 祝你好运


    王勇

    终于解决了:) 必须将消息传递给pubsubpublish运算符,如下所示:

    messages={'data':({{{task_instance.xcom_pull(key='encoded_string',task='download_yaml')}}

    然后将消息传递给参数消息。 t2=PubSubPublishOperator(项目=project,主题=topic,任务id='publish-messages',messages=messages,dag=dag)

    致意
    Sakshi

    下载yaml功能的缩进将关闭。这就是您在python文件中使用它的方式吗?或者这只是你文章中的格式?此外,您是否能够提供有关所获得错误的进一步信息?DAG是否显示在气流UI中?还是丢失了?日志中显示了哪些错误?谢谢。不,我想就在这儿。我的python上没有任何缩进错误。此外,DAG确实会显示在UI中,但会显示一条消息,并且主计划程序不知道它的存在。显示了DAG的名称,但没有执行或查看日志的选项。因此,基本上它并没有像应该的那样在气流中加载DAG。我怀疑的是,这是否是将消息传递给pubsubpublish操作符的正确wat?我尝试将{'data':b64encode(encoded_string)}更改为{'data':b64encode('hello')},DAG看起来很好。但是就像你在日志中说的,它没有说它发布了一些东西给PubSub。我现在正在尝试使用Xcom。Thaks为了你的建议,dag现在显示在UI中。然而,这是失败的。def pull_function(**context):value=context['download_yaml_as_string'].xcom_pull(task_id='publish-messages')t2=pubsubublicshoperator(project=project,topic=topic,task_id='publish-messages',messages=pull_function,dag=dag)我正在使用这段代码,但这给了我一个错误,我无法将函数传递给参数“messages”。我怎样才能传递这个值呢。您必须将xcome推入以在T1任务中创建一个xcom数据,然后再将其拉入T2任务。此外,您必须使用content[“ti”].xcom\u pull(key='publish-messages',value=.format)来推送数据。根据文档:,我正在返回一个值,因此我会自动推送这个值。我是否也需要显式推送它?我是这样拉的:def pull\u函数(**kwargs):ti=kwargs['ti']value2=ti.xcom\u pull(key=None,task\u id='download\u yaml',format=string)但是这是有错误的。还有如何将它传递给messages参数:t2=pubsububpublisheperator(project=project,topic=topic,task\u id='publish-messages',messages=?,dag=dag)希望您能帮助我。再次感谢。是的。您可以在两种模式下推送xcom数据:默认(隐式)对于第二种模式,它类似于.kwargs['ti'].xcom\u push(key='value from pusher 1',value=messages)。注意:气流中有很多有用的dag示例。您可以从中学习。要打开它们,您只需将airfold.cfg-->load_examples=True设置为。如果您觉得我的答案有用,请投票。谢谢Yong Wong。