Apache Beam未将无界数据保存到文本文件

时间:2018-09-21 14:02:10

标签: java google-cloud-dataflow apache-beam

我创建了一个管道,使用Apache Beam和Java将Google Cloud Pubsub消息保存到文本文件中。 每当我使用--runner=DataflowRunner在Google Dataflow中运行管道时,邮件就会正确保存。

但是,当我使用--runner=DirerctRunner运行相同的管道时,消息不会保存。

我可以看到事件正在通过管道进行,但是什么也没发生。

管道是下面的代码:

public static void main(String[] args) {
    ExerciseOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().as(ExerciseOptions.class);

    Pipeline pipeline = Pipeline.create(options);

    pipeline
      .apply("Read Messages from Pubsub",
        PubsubIO
          .readStrings()
          .fromTopic(options.getTopicName()))

      .apply("Set event timestamp", ParDo.of(new DoFn<String, String>() {
        @ProcessElement
        public void processElement(ProcessContext context) {
          context.outputWithTimestamp(context.element(), Instant.now());
        }
      }))

      .apply("Windowing", Window.into(FixedWindows.of(Duration.standardMinutes(5))))

      .apply("Write to File",
        TextIO
          .write()
          .withWindowedWrites()
          .withNumShards(1)
          .to(options.getOutputPrefix()));

    pipeline.run();
  }

我做错了什么?可以在本地运行此管道吗?

1 个答案:

答案 0 :(得分:1)

在测试管道时,我遇到了与您相同的问题。 PubSubIODirectRunnerTextIO无法正常工作。

我通过触发找到了解决此问题的某种解决方法。

.apply(
                    "2 minutes window",
                    Window
                            .configure()
                            .triggering(
                                    Repeatedly.forever(
                                            AfterFirst.of(
                                                AfterPane.elementCountAtLeast(10),
                                                AfterProcessingTime
                                                        .pastFirstElementInPane()
                                                        .plusDelayOf(Duration.standardMinutes(2))
                                            )
                                    )
                            )
                            .into(
                                FixedWindows.of(
                                        Duration.standardMinutes(2)
                                )
                            )
            )

通过这种方式可以正确写入文件。希望这会帮助某人。