使用Beam在FlinkCluster上运行流字计数

时间:2019-05-01 09:06:14

标签: apache-beam

我正在尝试在本地WindowedWordCount(NewWordCount)集群上使用Beam运行修改后的flink示例。现在,我希望它从指定的本地目录连续读取数据,基于窗口执行wordcount,然后为每个窗口输出单个文件。该窗口是基于时间的(1分钟)。对于输出,触发器可以基于时间或基于记录。 我在用 Flink 1.7 梁2.11

NewWordCount是我尝试过的代码。我正在使用的命令是:

mvn compile exec:java -D exec.mainClass=org.apache.beam.examples.NewWordCount -D exec.args="--runner=FlinkRunner --flinkMaster=localhost --filesToStage=.\target\word-count-beam-bundled-0.1.jar --inputFile='<dir path>\input\*' --output='<dir path>\output_streaming\count' --streaming=true --parallelism=1" -P flink-runner

这对于目录中的文件很好用。它读取所有文件,计算输出并创建两个带字数的输出文件。管道继续运行,但是它不会读取目录中的新文件(据我所知,流应该如此)。输出既不是连续的,也不是基于窗口的,即使在输入巨大的情况下也是如此

public static class DefaultToMinTimestampPlusOneHour implements DefaultValueFactory<Long> {
  @Override
  public Long create(PipelineOptions options) {
    return options.as(Options.class).getMinTimestampMillis()
      + Duration.standardHours(1).getMillis();
  }
}

...

static void runWindowedWordCount(Options options) throws IOException {
  final String output = options.getOutput();
  final Instant minTimestamp = new Instant(options.getMinTimestampMillis());
  final Instant maxTimestamp = new Instant(options.getMaxTimestampMillis());

  Pipeline pipeline = Pipeline.create(options);
  Pipeline p = Pipeline.create(options);

    pipeline
        .apply(ParDo.of(new AddTimestampFn(minTimestamp, maxTimestamp)))
        .apply(Window.<String>into(FixedWindows.of(Duration.standardMinutes(1)))
                                      .triggering(AfterWatermark.pastEndOfWindow()
                                      .withEarlyFirings(
                                          AfterProcessingTime.pastFirstElementInPane()
                                              .plusDelayOf(Duration.standardMinutes(1)))
                                      .withLateFirings(
                                          AfterProcessingTime.pastFirstElementInPane()
                                              .plusDelayOf(Duration.standardMinutes(2))))
                              .withAllowedLateness(Duration.standardMinutes(1))
                              .accumulatingFiredPanes())
        .apply(new WordCount.CountWords())
        .apply(MapElements.via(new WordCount.FormatAsTextFn()))
        .apply(new WriteOneFilePerWindow(output, options.getNumShards()));

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

  runWindowedWordCount(options);
 }
}

1 个答案:

答案 0 :(得分:0)

我不知道您使用的是什么输入变换,因为在您的示例代码中找不到输入变换。如果要连续输入,则应使用无限制的源。对于TextIOwatchForNewFiles完成了工作。