使用Apache Beam将Kafka Stream输出写入多个目录

时间:2018-07-13 20:07:58

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

我想使用数据流将Kafka主题中的数据持久保存到Google存储中。

我已经在本地编写了示例代码,一切正常。

public static void main(String[] args) {
    PipelineOptions options = PipelineOptionsFactory.create();
    Pipeline p = Pipeline.create(options);
    p.apply(KafkaIO.<Long, String>read().withBootstrapServers("localhost:9092").withTopic("my-topic")
            .withKeyDeserializer(LongDeserializer.class).withValueDeserializer(StringDeserializer.class))
            .apply(Window
                    .<KafkaRecord<Long, String>>
                    into(FixedWindows.of(Duration.standardMinutes(1)))
            )
            .apply(FlatMapElements.into(TypeDescriptors.strings())
                    .via((KafkaRecord<Long, String> line) -> TextUtil.splitLine(line.getKV().getValue())))
            .apply(Filter.by((String word) -> StringUtils.isNotEmpty(word))).apply(Count.perElement())
            .apply(MapElements.into(TypeDescriptors.strings())
                    .via((KV<String, Long> lineCount) -> lineCount.getKey() + ": " + lineCount.getValue()))
            .apply(TextIO.write().withWindowedWrites().withNumShards(1)
                    .to("resources/temp/wc-kafka-op/wc"));

    p.run().waitUntilFinish();
}

以上代码可完美运行。但是我想将每个窗口的输出保存在单独的目录中。

例如{BasePath} / {Window} / {prefix} {Suffice}

我无法使其正常工作。

1 个答案:

答案 0 :(得分:2)

当您可以指定名称的派生方式时,TextIO支持windowedWrites。参见JavaDoc