最近面试问到实时流连接的比较多,写这篇文章主要是从flink的算子层面介绍在自己的理解中flink实时流连接的方式,和每种方式应用的局限性,首先,在flink中可以实现流连接的算子主要有:connect,union,window join,cogroup,interval join,以下分别介绍这几个算子的实现方式:
1,connect:
不管是做维表关联还是实时流连接 connect应用的都比较多;
在做维表关联时,通常会将维表流进行广播,通过connect连接所要关联的实时流,通过实现coProcess方法对两条流的数据进行操作;
在实时流连接时,将两条流通过connect关联之后,实现CoProcess方法,一般会将未关联到的两条数据分别存放到状态中,当一条流的数据过来时,会先查询另外一条流的状态是否有能关联到数据,有的话直接关联之后发送到下游中,否则存放到状态中,等待被关联;这种关联方法的优点时只要数据不丢失一般都能关联到,适用于对数据关联成功性要求比较高的场景中,但同时,因为数据在等待关联时等待时间过久,下游数据很难保证有序,还要注意状态存储问题,可设置TTL,定期清理过期数据(也可以设置一个定时器对于过期未关联的数据侧输出之后去Hbase表中查询数据);对于长时间未关联到的数据可通过将实时流分别写入两个不同的Hbase表中,然后查询Hbase表中看是否有能关联到的数据;
2,union 只是适用于两条或者多条数据类型相同的流的连接,可以同时实现多条流连接;
3,wiondow join:
其实就是将两条流的数据通过窗口缓存起来,通过实现apply方法,来操作窗口内缓存的数据;
缺点时:因为时先实现 where,再实现窗口,所以如果没有实现where数据将会丢失:
4,cogroup:
也是将数据通过窗口缓存然后再操作,和window join相比数据不会因为丢失;
5,