应用于每个输入

时间:2018-09-26 12:31:00

标签: java apache-flink

我有一个FlinkKafkaConsumer011订阅了一个主题。我希望在每个kafka消费者消息上处理(apply),因此自定义FooTrigger在每个元素上返回TriggerResult.FIRE

以下代码有效,我对timeWindowAll(Time.minutes(1))感到困惑。看来我做错了。

// set up streaming execution environment
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime);

// create a Kafka consumer
FlinkKafkaConsumer011<Foo> consumer =  new FlinkKafkaConsumer011<>(
    "topic",
    new Foo.FooSchema(),
    props);   // Properties object

// create Kafka consumer data source
DataStream<FooTuple> trades = env.addSource(consumer)
    .timeWindowAll(Time.minutes(1))
    .trigger(new FooTrigger())
    .evictor(new FooEvictor())
    .apply(new CreateFoos());

1 个答案:

答案 0 :(得分:1)

如果您的目标是将功能应用于流中的每个事件,则ProcessFunction是在Flink中执行此操作的更自然的方法。或者在更简单的情况下,您可以使用地图或平面图,或它们的丰富变体,即RichMapFunction或RichFlatMapFunction,这全都取决于您要执行的操作。

使用地图或平面图,您可以执行无状态的一对一或一对多转换,其丰富的变体可以使用键控状态,而ProcessFunction可以使用状态和计时器(只要流已被键控)

timeWindowAll适用于流没有按键分区的情况,并且您要按时间长度定义的批次进行非并行处理(对于键控并行窗口,请改用timeWindow)。如果您要做的只是在数据到达时进行处理,则加窗会增加不必要的复杂性。