Cloud Pub / Sub to GCS,按元素写入(数据流管道)

时间:2018-06-22 16:12:52

标签: google-cloud-storage google-cloud-dataflow publish-subscribe apache-beam

每次从Pubsub收到消息时,如何写GCS,它都会进行窗口写入,而不是按元素写入。非常感谢任何有关此事的提示。

示例链接(https://github.com/GoogleCloudPlatform/DataflowTemplates/blob/master/src/main/java/com/google/cloud/teleport/templates/PubsubToText.java

运行此示例代码后,它会编写发送到GCS的发布-订阅消息。但是,当持续时间设置为1分钟时,它将保存所有消息,然后在一分钟后写入1个文件,但是我希望它将每条消息写入不同的文件。

3 个答案:

答案 0 :(得分:2)

如果每条消息需要一个文件,一个选择就是创建这样的简单转换:

package com.myapp.dataflow.transform;

import org.apache.beam.sdk.transforms.DoFn;
import com.google.cloud.storage.*;
import static java.nio.charset.StandardCharsets.UTF_8;

public class StringToGcsFile extends DoFn<String, Blob> {
    private Storage storage;
    private String bucketName = "my-bucket";

    @Setup
    public void setup() {
        storage = StorageOptions.getDefaultInstance().getService();
    }

    @ProcessElement
    public void processElement(ProcessContext c) {
        // consider some strategy for object names, UUID or something
        String blobName = "my_blob_name";

        // Upload a blob to the bucket
        BlobId blobId = BlobId.of(bucketName, blobName);
        BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build();
        Blob blob = storage.create(blobInfo, c.element().getBytes(UTF_8));

        c.output(blob);
    }
}

Maven依赖项:

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-storage</artifactId>
    <version>1.35.0</version>
</dependency>

答案 1 :(得分:0)

您可以创建一个Google Cloud Function以自动执行此操作。可以通过4个不同的事件triggered来使用云功能。其中之一是Pub/Sub message publishing。 如果要测试示例,请参考此Pub/Sub tutorial

您应该编写代码以将每条消息正确重定向到所需的GCS,例如,基于“发布/订阅”主题。

答案 2 :(得分:0)

我已经使用processElement实现了相同的功能。

下面是示例代码。

管道步骤:

pipeline_object.apply("Manually write events to GCS", ParDo.of(new Write_to_GCS()));

ProcessElement函数:

@SuppressWarnings("serial")
static class Write_to_GCS extends DoFn<KV<String, String>, TextIO.Write> {
    @ProcessElement
    public void processElement(ProcessContext c) throws JSONException {

        // Fetch text you need to write into file
        String output_string = c.element().getValue();

        // Create your service object
        Storage storage = StorageOptions.getDefaultInstance().getService();

        // Upload a blob to the newly created bucket
        BlobId blobId = BlobId.of(GCS_BUCKET_NAME, STORAGE_FILE_PATH);
        BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build();
        @SuppressWarnings("unused")
        Blob blob = storage.create(blobInfo, event_string.getBytes(UTF_8));
    }
}

您将需要在pom.xml中包括以下依赖项

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-storage</artifactId>
    <version>1.37.1</version>
</dependency>

此代码将执行的操作是创建一个gcs存储服务对象,并将一个blob写入指定的路径。