DAG不接受参数化消息

时间:2019-06-10 23:02:33

标签: google-cloud-platform airflow google-cloud-pubsub

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

我下面的代码可以完美打印消息,但是当我将此DAG上传到气流时,它不会加载。我认为这是我的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运算符中将encode_string作为消息传递,以便将其发布。

3 个答案:

答案 0 :(得分:0)

如果在用户界面中看到DAG,但收到注释中提到的错误(主调度程序不知道其存在),那么我建议您先快速了解一下调度程序!确保调度程序可以访问您的DAG,然后尝试重新启动调度程序。当您遇到该错误...时,您将在Web UI中看到DAG,但将无法运行它或查看其日志。

关于您有关将消息传递给PubSubPublishOperator的其他问题,我认为应该可以正常工作!

答案 1 :(得分:0)

这里有两点供您考虑。 1.对于dag运营商之间的信息交换,Xcom应该是更官方的方式。

  

XComs允许任务交换消息,允许更细微的形式   控制和共享状态。名称是的缩写   “交叉交流”。 ......任何物体   可以腌制,可以用作XCom值,因此用户应确保   使用适当大小的物体。

     

XCom可以“推”(发送)或“拉”(接收)。 .....

     

任务调用xcom_pull()检索XCom,可以选择应用过滤器   基于诸如密钥,源task_id和源dag_id之类的条件。 ......

https://airflow.apache.org/concepts.html#xcoms

  1. 您的python文件可能会运行并获得未知结果,因为消息与任务t1没有关系。它只是在开始通过函数download_yml来实现的。尽管t1再次调用download_yml,但是并没有更改消息。因此,T2仅获得具有初始值的消息。要解决此问题,您必须将t1中的消息推送到Xcom,然后从tcom中将t2中的消息拉出。

祝你好运。

王勇

答案 2 :(得分:0)

最后我可以解决它:) 该消息必须传递给pubsubpublish运算符,如下所示:

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

,然后将消息传递给参数消息。 t2 = PubSubPublishOperator(project = project,topic = topic,task_id ='publish-messages',messages = messages,dag = dag)

最佳问候 萨克什