Flink实现异步IO实战
基本概念
首先通过官网的一个图片了解一下Asynchronous I/O
Flink source收到一条数据就会进行处理,如果需要通过这条数据关联外部数据源,例如mysql,在发出查询请求后,同步IO的方式是会等待查询结果再处理下一条数据的查询,也就是每一条数据都要等待上一个查询结束。而异步IO是指数据来了以后发出查询请求,先不等查询结果,直接继续发送下一条的查询请求,对于查询结果是异步返回的,返回结果之后再进入下一个算子的计算。这两种方式性能差距请看下的样例。
案例
生成6条数据,从0开始递增的6个数字。模拟异步查询之后,加上时间戳输出。
public class AsyncIODemo {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
final int maxCount = 6;
final int taskNum = 1;
final long timeout = 40000;
DataStream<Integer> inputStream = env.addSource(new SimpleSource(maxCount));
AsyncFunction<Integer, String> function = new SampleAsyncFunction();
DataStream<String> result = AsyncDataStream.unorderedWait(
inputStream,
function,
timeout,
TimeUnit.MILLISECONDS,
10).setParallelism(taskNum);
result.map(new MapFunction<String