繁体   English   中英

Apache Flink异步请求和Windows

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM