基本概念
双流Join是Flink面试的高频问题。一般情况下说明以下几点就可以hold了:
- Join大体分类只有两种:Window Join和Interval Join。Window Join又可以根据Window的类型细分出3种:
Tumbling Window Join、Sliding Window Join、Session Widnow Join。 - Windows类型的join都是利用window的机制,先将数据缓存在Window State中,当窗口触发计算时,执行join操作;
- interval join也是利用state存储数据再处理,区别在于state中的数据有失效机制,依靠数据触发数据清理;
- 目前Stream join的结果是数据的笛卡尔积;
- 日常使用中的一些问题,数据延迟、window序列化相关。特别期待有人留言说下使用中的问题。
源码速读
说明
- 源码版本: flink-release-1.6.1
- 关注的流程:window join 的处理
代码样例
首先看看双流join的样例:
* From JoinedStream.java 的注释
* DataStream<Tuple2<String, Integer>> one = ...;
* DataStream<Tuple2<String, Integer>> twp = ...;
*
* DataStream<T> result = one.join(two)
* .where(new MyFirstKeySelector())co
* .equalTo(new MyFirstKeySelector())
* .window(TumblingEventTimeWindows.of(Time.of(5, TimeUnit.SECONDS)))
* .apply(new ());
* } </pre>
*/
关键方法的实现
在api层面,前面的算子where、equals、window等操作基本就是在记录信息。方法apply的实现中可以看到关键处理:
// From JoinedStream.java
public <T> DataStream<T> apply