每次从Pubsub收到消息时,如何写GCS,它都会进行窗口写入,而不是按元素写入。非常感谢任何有关此事的提示。
运行此示例代码后,它会编写发送到GCS的发布-订阅消息。但是,当持续时间设置为1分钟时,它将保存所有消息,然后在一分钟后写入1个文件,但是我希望它将每条消息写入不同的文件。
答案 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写入指定的路径。