![](/img/trans.png)
[英]Google Cloud - How to get data from remote PubSub as input for Apache Beam Pipeline executing locally?
[英]How to read and parse data from PubSub topic into a beam pipeline and print it
我有一个程序可以在pubSub中创建一个主题,并且还可以将消息发布到该主题。 我还有一个自动化的数据流作业(使用模板),它将这些消息保存到我的BigQuery表中。 现在,我打算用python管道替换基于模板的作业,我的要求是从PubSub读取数据,应用转换并将数据保存到BigQuery中/发布到另一个PubSub主题。 我开始用python编写脚本并进行了大量的尝试和错误来实现它,但令我沮丧的是,我无法实现它。 代码如下:
import apache_beam as beam
from apache_beam.io import WriteToText
TOPIC_PATH = "projects/test-pipeline-253103/topics/test-pipeline-topic"
OUTPUT_PATH = "projects/test-pipeline-253103/topics/topic-repub"
def run():
o = beam.options.pipeline_options.PipelineOptions()
p = beam.Pipeline(options=o)
print("I reached here")
# # Read from PubSub into a PCollection.
data = (
p
| "Read From Pub/Sub" >> beam.io.ReadFromPubSub(topic=TOPIC_PATH)
)
data | beam.io.WriteToPubSub(topic=OUTPUT_PATH)
print("Lines: ", data)
run()
如果能尽早获得帮助,我将不胜感激。 注意:我在Google云端上设置了我的项目,并且我的脚本在本地运行。
根据Beam编程指南 ,您只需在管道中添加一个Transform步骤。 这是一个示例或转换:
class PrintValue(beam.DoFn):
def process(self, element):
print(element)
return [element]
将其添加到您的管道
data | beam.ParDo(PrintValue()) | beam.io.WriteToPubSub(topic=OUTPUT_PATH)
您可以添加所需的变换数量。 您可以测试该值并设置标记的PCollection中的元素(用于具有多个输出)以扇出,或将侧面输入用于PCollection中的风扇。
这里是工作代码。
import apache_beam as beam
TOPIC_PATH = "projects/test-pipeline-253103/topics/test-pipeline-topic"
OUTPUT_PATH = "projects/test-pipeline-253103/topics/topic-repub"
class PrintValue(beam.DoFn):
def process(self, element):
print(element)
return [element]
def run():
o = beam.options.pipeline_options.PipelineOptions()
# Replace this by --stream execution param
standard_options = o.view_as(beam.options.pipeline_options.StandardOptions)
standard_options.streaming = True
p = beam.Pipeline(options=o)
print("I reached here")
# # Read from PubSub into a PCollection.
data = p | beam.io.ReadFromPubSub(topic=TOPIC_PATH) | beam.ParDo(PrintValue()) | beam.io.WriteToPubSub(topic=OUTPUT_PATH)
# Don't forget to run the pipeline!
result = p.run()
result.wait_until_finish()
run()
综上所述
--streaming
参数来启动代码,也可以按照我的代码所示以编程方式进行 请注意,流模式意味着不确定地收听PubSub。 如果在Dataflow上运行它,则管道将一直处于运行状态,直到停止它为止。 如果您几乎没有消息,这可能会导致成本高昂。 确保这是目标模型
一种替代方法是在有限的时间段内使用管道(使用调度程序启动它,使用另一个调度程序停止它)。 但是,此刻,您必须堆叠消息。 在这里,您将Topic
用作管道的条目。 此选项强制Beam创建一个临时订阅并在此订阅上侦听消息。 这意味着将不会接收和处理在创建此订阅之前发布的消息。
这个想法是创建一个订阅,通过这种方式,消息将被堆积在其中(默认情况下,最长为7天)。 然后,在管道beam.io.ReadFromPubSub(subscription=SUB_PATH)
条目中使用订阅名称。 邮件将被Beam堆叠和处理(无法保证订购!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.