Python 2.7 梁管道(PY)输出未写入本地主机磁盘

Python 2.7 梁管道(PY)输出未写入本地主机磁盘,python-2.7,google-cloud-dataflow,apache-beam,Python 2.7,Google Cloud Dataflow,Apache Beam,我正在学习Apache中的窗口和触发概念,目的是: 读取无界源(PubSub) 每隔5秒将传入消息写入本地主机磁盘固定窗口间隔 问题:没有将输出写入本地主机磁盘(管道确实创建了一个beam team-文件夹,并在其中写入了一些文件,但预期目标中没有每5秒写入一次output.csv。) 运行ApacheBeam==2.9.0,Python 2.7.10 尝试了两种方法:DirectRunner,以及DataFlowRunner(目标为GCS Bucket) 以下是代码(非常感谢您的建议)

我正在学习Apache中的窗口和触发概念,目的是:

  • 读取无界源(PubSub)
  • 每隔5秒将传入消息写入本地主机磁盘固定窗口间隔
问题:没有将输出写入本地主机磁盘(管道确实创建了一个beam team-文件夹,并在其中写入了一些文件,但预期目标中没有每5秒写入一次output.csv。)

  • 运行ApacheBeam==2.9.0,Python 2.7.10
  • 尝试了两种方法:DirectRunner,以及DataFlowRunner(目标为GCS Bucket)
以下是代码(非常感谢您的建议):

非常感谢您的建议


干杯

您正在从无限源读取数据,并试图写入有界源。虽然Beam API for Java使用方法支持它,但Python还不支持它,这是一个期待已久的有用特性。因此,您需要切换到java或将其写入BigQuery。

当使用direct runner运行时,是否可以在控制台中检查输出?那里有什么相关信息吗?有错误吗?没有,没有。只有弃用警告:/Applications/py\u venvs/dataflow\u py2/lib/python2.7/site packages/apache\u beam/runners/direct/direct\u runner.py:365:beam弃用警告:选项自第一个稳定版本以来已弃用。对.options的引用将不受支持您是否检查过没有分片文件?类似于output-0000-of-0010.csv的内容?我已经检查过了。。DIrectRunner仅创建了一个beam temp-*目录,在该目录中转储预期的输出文件(暂时?!)。。但是在预期的输出目录(python pipeline.py--runner DirectRunner--input-input-input.csv--output-output-streaming)中没有任何东西可以得到输出,Dataflow runner的行为也与此类似,除了:它输出分片文件,但仍在beam temp-*目录中。。我作为参数传递给beam.io.WriteToText()的gs://bucket位置中的任何输出都无法应用Trggers AfterWatermark()解决问题?根据我的理解,它应该在每个窗口关闭时发出结果并输出到文本文件…不幸的是,没有。如果您将写入接收器修改为pub/sub或bigquery,您将发现触发工作正常。只是PythonAPI还不支持写无限的目标
p = beam.Pipeline(runner=None, options=options, argv=None)

"""
#1) Read incoming messages & apply Windowing
"""
lines = p | "read_sub" >> beam.io.gcp.pubsub.ReadFromPubSub(topic=None, subscription=SUBSCRIBER, with_attributes=True) \


"""
#2) Apply 5 sec Windowing
"""
          | 'window' >> beam.WindowInto(beam.window.FixedWindows(5))


"""
#3) apply Map() ops
"""
output = lines | "pardo" >> beam.Map(lambda x: x.data)


"""
#4) write out to localhost disk
"""

output | beam.io.WriteToText('output', file_name_suffix='.csv', header='time, colname1, colname2')

p.run().wait_until_finish()