apache flink session支持

Leo*_*ers 3 streaming session apache-flink

我正在调查Apache Flink Streaming,用于我们的ETL和机器学习平台.我还没想到的是如何将事件流式传输到"会话"中.更具描述性:所有事件都包含会话ID,为了丰富数据,我需要将属于会话的所有事件组合在一起.请注意事件是连续流入的(因此没有批量支持,之后您可以简单地执行groupBy例如)

一种可能的解决方案是维护会话的LRU缓存并将所有传入事件排序到其关联会话.然后,在每个会话不活动X分钟后,可以从缓存中"关闭"或逐出会话.问题是如何在多租户系统中处理此缓存; flink是否具有分布式缓存的概念,还是包含某种智能负载均衡器,其中事件被定向到网格中的同一分区?

更一般地说:使用流式api建立会话支持的最佳方式(用例和陷阱)是什么?这有可能吗?以及如何处理重放流?(即从事件流入不完整会话的特定时间点开始(即在时间点之前发生事件)

对任何反馈,想法和/或指针感兴趣.

提前致谢

alj*_*cha 5

我创建了一个可能非常接近您需要的示例:https://gist.github.com/aljoscha/91b6422114eac814479f

我使用a Tuple2<Integer,String>来模拟数据.整数是会话ID,而String是我们键入(分区)数据的某个字段.

我建议你先看看这个main()方法,你看到程序的流程.其他位是自定义窗口定义SessionWindow窗口分配器和SessionTrigger.这基本上实现了您建议的缓存的想法.窗口根据指定的窗口和密钥保存在缓冲区中.触发器触发后,我们处理窗口并清除内容.

当触发器接收到一个元素时,它将来会注册一个计时器10秒钟.如果到那时没有新元素到达,则触发器将触发.如果新元素到达该时间窗口内,它将注册一个新的定时器,这将取代旧定时器,因为触发器一次只能有一个活动定时器.

此外,这使用所谓的处理时间窗口.这也可以根据事件时间(即元素的时间戳)更改为触发.