我正在尝试在本地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);
}
}
答案 0 :(得分:0)
我不知道您使用的是什么输入变换,因为在您的示例代码中找不到输入变换。如果要连续输入,则应使用无限制的源。对于TextIO
,watchForNewFiles
完成了工作。