使用Cloud Dataflow将数据从PubSub流式传输到Google云端存储

时间:2016-11-02 16:22:02

标签: google-app-engine google-cloud-storage google-cloud-dataflow

我正在使用数据流中的流数据来监听pub-sub中的数据。 然后我需要上传到存储,处理数据并将其上传到bigquery。

这是我的代码:

public class BotPipline {

public static void main(String[] args) {

    DataflowPipelineOptions options = PipelineOptionsFactory.as(DataflowPipelineOptions.class);
    options.setRunner(BlockingDataflowPipelineRunner.class);
    options.setProject(MY_PROJECT);
    options.setStagingLocation(MY_STAGING_LOCATION);
    options.setStreaming(true);

    Pipeline pipeline = Pipeline.create(options);

    PCollection<String> input = pipeline.apply(PubsubIO.Read.maxNumRecords(1).subscription(MY_SUBSCRIBTION));

    input.apply(TextIO.Write.to(MY_STORAGE_LOCATION));

    input
    .apply(someDataProcessing(...)).named("update json"))
    .apply(convertToTableRow(...)).named("convert json to table row"))
            .apply(BigQueryIO.Write.to(MY_BQ_TABLE).withSchema(tableSchema)
    );
    pipeline.run();
}

}

当我运行代码注释写入存储时,代码运行良好。 但是当我尝试上传到大查询时,我得到了这个错误(这是预期的......):

Write can only be applied to a Bounded PCollection

我没有使用绑定,因为我需要一直运行这个,我需要立即上传数据。 有解决方案吗

修改 这是我想要的行为:

我正在通过pubsub接收消息。 每条消息都应作为粗略数据存储在GCS中自己的文件中, 对数据执行一些处理,然后将其保存到大查询中 - 在数据中具有文件名。

在BQ收到数据后应立即看到数据 例如:

data published to pubsub : {a:1, b:2} 
data saved to GCS file UUID: A1F432 
data processing :  {a:1, b:2} -> 
                   {a:11, b: 22} -> 
                   {fileName: A1F432, data: {a:11, b: 22}} 
data in BQ : {fileName: A1F432, data: {a:11, b: 22}} 

这个想法是处理后的数据存储在BQ中,其中包含存储在GCS中的粗略数据的链接

1 个答案:

答案 0 :(得分:2)

目前,我们不支持在TextIO.Write中编写无界集合。请参阅related question

你能澄清一下你想要无界TextIO.Write的行为吗?例如。你希望有一个不断增长的文件,或每个窗口一个文件,当窗口关闭时关闭,或其他什么,或者只是对你来说,写入的文件的总内容最终将包含所有PubSub消息,但它无论文件的结构如何等都无关紧要?

作为一种变通方法,您可以将自己的DoFn写入GCS,使用IOChannelFactory与GCS进行互动(事实上,TextIO.Write只是一个复合词变换,用户可以从头开始编写自己。)

您可以使用BoundedWindow上的可选@ProcessElement参数访问数据窗口。如果您解释所期望的行为,我将能够提供更多建议。