Beam数据流仅在GCS中写入温度

时间:2018-11-19 17:10:53

标签: google-cloud-storage google-cloud-dataflow apache-beam google-cloud-pubsub

我有一个非常基本的Python数据流作业,可以从Pub / Sub中读取一些数据,应用FixedWindow并写入Google Cloud Storage。

transformed = ...
transformed | beam.io.WriteToText(known_args.output)

将输出写入--output中特定的位置,但仅写入临时阶段,即

gs://MY_BUCKET/MY_DIR/beam-temp-2a5c0e1eec1c11e8b98342010a800004/...some_UUID...

文件永远不会使用分片模板放置在正确命名的位置。

在本地和DataFlow运行器上测试。


在进一步测试时,我注意到streaming_wordcount示例具有相同的问题,但是标准的wordcount示例就可以了。也许问题出在开窗还是从pubsub中读取内容?


似乎WriteToText与PubSub的流源不兼容。可能有解决方法,或者Java版本可能兼容,但我选择完全使用其他解决方案。

2 个答案:

答案 0 :(得分:2)

Python SDK中的WriteToText转换不支持流传输。

相反,您可以考虑apache_beam.io.fileio中的变换。在这种情况下,您可以编写如下内容(假设窗口为10分钟):

my_pcollection = (p | ReadFromPubSub(....)
                    |  WindowInto(FixedWindows(10*60))
                    |  fileio.WriteToFiles(path=known_args.output))

这足以为每个窗口写出单独的文件,并随着流的前进继续执行。

您会看到类似这样的文件(假设输出为gs://mybucket/)。在触发窗口时将打印文件:

gs://mybucket/output-1970-01-01T00_00_00-1970-01-01T00_10_00-0000-00002
gs://mybucket/output-1970-01-01T00_00_00-1970-01-01T00_10_00-0001-00002
gs://mybucket/output-1970-01-01T00_10_00-1970-01-01T00_20_00-0000-00002
gs://mybucket/output-1970-01-01T00_10_00-1970-01-01T00_20_00-0001-00002
...

默认情况下,文件具有$prefix-$start-$end-$pane-$shard-of-$numShards$suffix$compressionSuffix名称-默认情况下前缀为output,但是您可以传递更复杂的函数来命名文件。


如果您想自定义文件的写入方式(例如,文件命名,数据格式或类似内容),可以查看WriteToFiles中的其他参数。

您可以看到在Beam测试中使用的转换示例here具有更复杂的参数-但听起来默认行为足以满足您的需求。

答案 1 :(得分:0)

Python流管道执行可以通过实验获得(有一些限制)。

不受支持的功能适用于所有跑步者。 状态和计时器API, 自定义源API, 可拆分DoFn API, 处理最新数据 用户定义的自定义WindowFn

此外,DataflowRunner当前不支持以下具有Python流执行功能的特定于Cloud Dataflow的功能。

流式自动缩放 更新现有管道 云数据流模板 一些监视功能,例如毫秒计数器,显示数据,指标和转换的元素计数。但是,支持源的日志记录,水印和元素计数。

https://beam.apache.org/documentation/sdks/python-streaming/

当您使用FixedWindowFn并且管道能够将数据写入tmp位置时,请重新检查输出位置--output gs://<your-gcs-bucket>/<you-gcs-folder>/<your-gcs-output-filename>