Apache Beam Python SDK,发布/订阅源在运行时卡住
我正在用ApacheBeam编写一个程序,使用Python SDK从发布/订阅中读取JSON文件的内容,并对接收到的字符串进行一些处理。这是程序中我从发布/订阅中提取内容并进行处理的部分: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
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)
运行程序时,在创建PCollectiontupled
之后,代码会被卡住(之后不会执行任何代码行)。奇怪的是,当我将源代码从Pub/Sub更改为包含完全相同内容的本地文件(使用ReadFromText()
)时,程序工作正常。
这种行为的原因可能是什么?根据发布/订阅I/O文档(和),默认情况下,发布/订阅IO转换使用无界的PCollection p集合可以是:
- 有界:数据来自固定源,如文件
- 无界:数据来自持续更新的源,例如发布/订阅
- 窗口:无界PCollections不能直接用于分组转换(例如您正在使用的
),因此您应该首先使用CombinePerKey
- 触发器:您可以对无界PCollection执行以下操作:它可以定期更新无界数据集,即使订阅中的数据仍在流动
pipeline_options.view_as(StandardOptions).streaming = True
谢谢我让代码工作了。但光靠开窗并不能奏效。添加这一行解决了管道选项的问题。将管道选项视为(标准选项)。流=真。知道这是做什么的吗?根据,PipelineOptions类只不过是解析args的包装器。在本例中,您是,这将启用您正在使用的流式管道。明白了。谢谢。如果您觉得它有用,请随时联系,以便社区将此问题视为已解决。谢谢我会的。我建议在您的答案中添加上述要点,即将流媒体选项设置为true,因为如果不这样做,问题仍然存在。