我有一个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());
答案 0 :(得分:1)
如果您的目标是将功能应用于流中的每个事件,则ProcessFunction
是在Flink中执行此操作的更自然的方法。或者在更简单的情况下,您可以使用地图或平面图,或它们的丰富变体,即RichMapFunction或RichFlatMapFunction,这全都取决于您要执行的操作。
使用地图或平面图,您可以执行无状态的一对一或一对多转换,其丰富的变体可以使用键控状态,而ProcessFunction可以使用状态和计时器(只要流已被键控)
timeWindowAll适用于流没有按键分区的情况,并且您要按时间长度定义的批次进行非并行处理(对于键控并行窗口,请改用timeWindow)。如果您要做的只是在数据到达时进行处理,则加窗会增加不必要的复杂性。