繁体   English   中英

如何从PubSub主题读取数据并将其解析到光束管道中并进行打印

[英]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()

综上所述

  • 您错过了运行管道的机会。 实际上,Beam是一个Graph编程模型。 因此,在之前的代码中,您构建了图形,但从未运行过它。 在这里,最后,运行它(不阻止调用)并等待最后(阻止调用)
  • 在启动管道时,Beam提到PubSub仅在流模式下工作。 因此,您可以使用--streaming参数来启动代码,也可以按照我的代码所示以编程方式进行

请注意,流模式意味着不确定地收听PubSub。 如果在Dataflow上运行它,则管道将一直处于运行状态,直到停止它为止。 如果您几乎没有消息,这可能会导致成本高昂。 确保这是目标模型

一种替代方法是在有限的时间段内使用管道(使用调度程序启动它,使用另一个调度程序停止它)。 但是,此刻,您必须堆叠消息。 在这里,您将Topic用作管道的条目。 此选项强制Beam创建一个临时订阅并在此订阅上侦听消息。 这意味着将不会接收和处理在创建此订阅之前发布的消息。

这个想法是创建一个订阅,通过这种方式,消息将被堆积在其中(默认情况下,最长为7天)。 然后,在管道beam.io.ReadFromPubSub(subscription=SUB_PATH)条目中使用订阅名称。 邮件将被Beam堆叠和处理(无法保证订购!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM