env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setParallelism(1)
DataStream<Integer> evenStream = env.addSource(new SourceFunction<Integer>(){
public void run(SourceContext<Integer> ctxt){
for (i=0; i < 20; i=i+2){
ctxt.collectWithTimestamp(i, i);
ctxt.emitWatermark(i);
}
}
}
)
DataStream<Integer> oddStream = env.addSource(new SourceFunction<Integer>(){
public void run(SourceContext<Integer> ctxt){
for (i=1; i < 21; i=i+2){
ctxt.collectWithTimestamp(i, i); // Using i as timestamp and watermark for this sample code, but in real code, I am using using timestamp of real event
ctxt.emitWatermark(i);
}
}
}
)
evenStream
.connect(oddStream)
.flatMap(new CoFlatMapFunction<Integer, Integer, Integer>(){
public void flatMap1(Integer evenNumber, Collector<Integer> out){
System.out.println(evenNumber);
}
public void flatMap2(Integer oddNumber, Collector<Integer> out){
System.out.println(oddNumber);
}
}
);
总之,我希望flatMap1()和flatMap2()按照我在事件中设置的时间戳的顺序被调用。但那不是真的。
Flink的协同函数(连接流上的函数)并不保证其方法的调用顺序。只要从两个输入中有可用的事件,就会调用这些方法(例如,FlatMap1()
和FlatMap2()
)。在您的示例中,偶数源生成的数据量太小,因此当奇数到达时,所有数据都已处理完毕。
那么,事件时处理对于协同函数是如何工作的呢?
协函数的水印始终是两个输入的最小水印。对于coflatmapfunction
来说,这其实并不重要,因为您既不能读取当前水印,也不能读取记录的时间戳。但是,通过coProcessFunction
,您可以访问这两个选项,并且可以注册当水印到达某个时间点时调用的计时器。如果您想在事件时间上对流出的流进行排序,您需要缓冲传入的事件(处于状态),并且当水印进展时,您可以按顺序发出所有记录,直到超过水印的时间为止。
我有一个事件系统,当一个特定的对象被改变时,我可以订阅它。在收到这个事件之后,我想要为这个对象执行一个任务。 同时更改多个对象是可能的。例如。如果我改变1000个对象,我将得到1000个事件。问题是,我要执行的任务处理1个对象1000次的时间比处理1000个对象1次的时间要长得多。我不能改变事件生成的方式。 所以我想的是,当我收到这些事件的时候,把它们批量起来。例如。在一个队列中收集1000个项目
我正在编写一个Lambda函数,用于处理DynamoDB流中的项。 我认为Lambda背后的部分观点是,如果我有一个大的事件突发,它将启动足够多的实例来同时通过它们,而不是通过单个实例顺序地提供它们。只要两个事件具有不同的键,我就可以不按顺序处理它们。 然而,我刚刚阅读了关于了解重试行为的这一页,上面说: 对于基于流的事件源(Amazon Kinesis Data Streams和DynamoDB
我研究Flink已经一个多星期了。我们正在从Kafka消费事件,我们希望事件属于一个特定的对象id需要按照事件时间的顺序进行处理。到目前为止,我的研究告诉我,我应该使用keyby和timewinds,我的理解是正确的吗? 另一个问题是,当一个任务管理器关闭时,只有属于该任务管理器的事件才会被停止处理,直到该任务管理器启动?检查点机制是否知道未被处理的事件,它将如何请求Kafka关于这些事件? 下面
事件 事件,就是文档与浏览器发生特定的 交互瞬间。JavaScript与HTML之间的交互就是通过事件实现的。 事件流 所谓事件流,就是接收页面事件的顺序。 事件流分 事件冒泡流 与 事件捕获流。事件冒泡流是IE开发团队提出的,捕获流是Netscape开发团队提出的。 事件冒泡流 所谓事件冒泡,就是事件开始时由 最具体的元素(文档中嵌套最深的那个 节点)接收,然后逐级向上传播到较为不具体的节点(文
TL;DR:目前保证Flink中事件时间顺序的最佳解决方案是什么? 我使用Flink 1.8.0和Kafka 2.2.1。我需要通过事件时间戳保证事件的正确顺序。我每隔1秒生成周期性水印。我使用Flink Kafka消费者与AscendingTimestampExtractor: 然后处理: 我意识到,对于在同一毫秒或几毫秒之后发生的无序事件,Flink不会纠正顺序。我在文档中发现: 水印触发所有
我可以在Axon中顺序处理的两个事件之间放置一个序列(或以一定的时间间隔执行)。这两个事件同时创建。下面是示例事件。 因为我的第二个事件取决于第一个事件的执行结果。我正在使用RabbitMq发布消息。