Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache Beam Python SDK,发布/订阅源在运行时卡住_Python_Apache Beam_Google Cloud Pubsub_Apache Beam Io - Fatal编程技术网

Apache Beam Python SDK,发布/订阅源在运行时卡住

Apache Beam Python SDK,发布/订阅源在运行时卡住,python,apache-beam,google-cloud-pubsub,apache-beam-io,Python,Apache Beam,Google Cloud Pubsub,Apache Beam Io,我正在用ApacheBeam编写一个程序,使用Python SDK从发布/订阅中读取JSON文件的内容,并对接收到的字符串进行一些处理。这是程序中我从发布/订阅中提取内容并进行处理的部分: with beam.Pipeline(options=PipelineOptions()) as pipeline: lines = pipeline | beam.io.gcp.pubsub.ReadStringsFromPubSub(subscription=known_args.subscrip

我正在用ApacheBeam编写一个程序,使用Python SDK从发布/订阅中读取JSON文件的内容,并对接收到的字符串进行一些处理。这是程序中我从发布/订阅中提取内容并进行处理的部分:

with beam.Pipeline(options=PipelineOptions()) as pipeline:
    lines = pipeline | beam.io.gcp.pubsub.ReadStringsFromPubSub(subscription=known_args.subscription)
    lines_decoded = lines | beam.Map(lambda x: x.decode("base64"))

    lines_split = lines_decoded | (beam.FlatMap(lambda x: x.split('\n')))

    def json_to_tuple(jsonStr):
        res = json.loads(jsonStr)
        ##printing retutn value
        print (res['id'], res['messageSize'])
        ##
        return (res['id'], res['messageSize'])

    tupled = lines_split | beam.Map(json_to_tuple)

    def printlines(line):
        print line

    result = tupled | beam.CombinePerKey(sum)
    result | beam.Map(printlines)
运行程序时,在创建PCollection
tupled
之后,代码会被卡住(之后不会执行任何代码行)。奇怪的是,当我将源代码从Pub/Sub更改为包含完全相同内容的本地文件(使用
ReadFromText()
)时,程序工作正常。
这种行为的原因可能是什么?

根据发布/订阅I/O文档(和),默认情况下,发布/订阅IO转换使用无界的PCollection

p集合可以是:

  • 有界:数据来自固定源,如文件
  • 无界:数据来自持续更新的源,例如发布/订阅
在对无界PCollection进行操作之前,必须使用以下策略之一:

  • 窗口:无界PCollections不能直接用于分组转换(例如您正在使用的
    CombinePerKey
    ),因此您应该首先使用
  • 触发器:您可以对无界PCollection执行以下操作:它可以定期更新无界数据集,即使订阅中的数据仍在流动
这可能解释了您看到的行为,即当从本地文件(有界数据源)读取时,同一管道工作,但当从发布/订阅订阅(无界数据源)读取时,该管道不工作

因此,为了使用发布/订阅订阅,您应该应用窗口或触发策略,以便在以下转换中正确处理PCollection中的数据

编辑:此外,正如@Arjun所发现的,可能需要通过使用以下命令设置适当的arg参数来启用管道中的流式传输选项:

pipeline_options.view_as(StandardOptions).streaming = True

谢谢我让代码工作了。但光靠开窗并不能奏效。添加这一行解决了管道选项的问题。将管道选项视为(标准选项)。流=真。知道这是做什么的吗?根据,PipelineOptions类只不过是解析args的包装器。在本例中,您是,这将启用您正在使用的流式管道。明白了。谢谢。如果您觉得它有用,请随时联系,以便社区将此问题视为已解决。谢谢我会的。我建议在您的答案中添加上述要点,即将流媒体选项设置为true,因为如果不这样做,问题仍然存在。