[英]Apache Flink async requests and windows
我无法选择适当的Windows功能/分配器。 任务正在执行。 首先,我从具有request_id的Source和一些数据中获取数据,并向外部数据库执行异步请求。
// Here String is for request_id, Data is for treated data
DataStream Tuple2<String, Data> stream = ...
// async I/O queries
DataStream<Tuple2<String, String>> resultStream =
AsyncDataStream.unorderedWait(
stream,
new AsyncDatabaseRequest(),
1000,
TimeUnit.MILLISECONDS,
100
);
现在,我想通过request_id收集所有数据并进行一些计算。
DataStream Tuple2<String, Integer> = result
.map(val -> new Tuple2<String, Integer>(val.f0, val.f1.data_int))
.keyBy(0)
.window(...)
.sum(1);
问题是窗口功能。 我需要每个窗口包含具有相同request_id的所有数据点,但是异步查询的时间可能从毫秒到分钟不等。 另一方面,我需要低延迟,因此不能使用ProcessingTimeSessionWindows.withGap(Time.minutes(10))
。 我需要从异步函数中获取最后一个数据后立即执行计算。
对我而言,最好的方法是使用异步函数中的窗口水印,该函数肯定知道每个查询何时完成以及它所承载的马赫数。 这可能吗?最佳的做法是什么?
好吧,我找到了解决方案,而且看起来很简单。 我只是使用EventTime。 在我的源函数中,我生成事件时间戳和水印,如下所示:
Long ts = System.currentTimeMillis();
ctx.collectWithTimestamp(data, ts);
ctx.emitWatermark(new Watermark(ts + 1));
在流中,我使用EventTime函数:
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
DataStream<...> dataStream = ...;
DataStream<...> newStream = dataStream
.keyBy(0)
.timeWindow(Time.milliseconds(1))
.reduce(new Reducer());
这样,我避免了超时,结果立即准备就绪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.