我有一个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作为消息传递,以便将其发布。
答案 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
祝你好运。
王勇
答案 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)
最佳问候 萨克什