6.一文搞定Flink的多流转换

1.前言

在之前的文章当中,我针对于Flink中状态相关的一系列内容按照我自己理解的方式进行了讲述,但是单纯从我写的内容上看,貌似都是围绕着单条流进行计算的,所以在感官上就很不全面,所以我就准备在这篇文章当中,来跟大家讲讲Flink中的多流转换。虽然明面上叫做多留转换,实际上就是对数据流的分流与合流操作,分流就是将数据流中的数据按照对应的规则进行拆分,拆分出来的数据流的数量没有特定,具体还是要看代码逻辑。合流操作就比较精彩了,可以分为联合(union)、连接(connect)以及联结(join),而联结也会分成窗口联结、间隔联结、同组联结这三种不同的类型。接下来咱们就按照这种模式,一点一点的对多流合并这一段功能进行讲述吧。


2.分流

在前言中也说了,多流转换实际上就是分流与合流操作的总称,那最开始就先讲讲分流操作吧。
分流操作比较简单,是需要通过对程序中定义不同的拆分逻辑,将原本的DataStream分成多个不同的平级的DataStream,在这个操作中,需要引入一个叫做侧输出流的概念,我们在代码处理的过程中,可以通过按照自己编写的代码逻辑,来新建出对应数量的侧输出流,然后通过筛选逻辑,将拆分的数据流放入到对应的侧输出流中。然后通过对主流调用对应的方法,即可获得。值得注意的是,这里说的侧输出流虽然名字上叫做侧输出,实际上与主流没有差别,彼此之间都是平级的。


3.合流

分流操作完成之后就说说合流,合流操作与分流操作相比就要丰富很多了,毕竟在做需求的时候,有很多业务场景需要进行各种join操作,因此丰富一些也很正常。

3.1 联合(union)

Union这种联合方式,是最简单的一种合流操作,并且也很好理解。它所做的,就是将很多条流合并成一条流,然后对这条流里面的数据进行统一的处理。不过它有一点点限制,就是要求流中流中的数据类型必须要是一样的。

但是Union还有一个需要考虑的点,就是水位线问题。因为多条流中的数据都汇入到这一条流中,那也就证明属于每条流各自的水位线也进入到了这条汇总流中了。我们知道,水位线是流淌在数据流中的一个用于进行时间判断的标志,所以在Unioned流中,要以最慢的那条流为基准,也可以把union场景想象成为多并行度操作在下游进行合并的过程。

3.2 连接(Connect)

union虽然能够将多条流合并在一起,但是要求多条流中的数据类型要是一样的,这就会导致某些场景之下很难对数据做对应的处理。所以便有Connect算子来实现不同类型的数据流的合并操作。只不过它也有一个要求,就是要求Connected数据流只能是两条不同的数据流汇集而成,再多就不行了。并且在进行连接后流的处理的时候,处理函数内部需要实现两个不同的计算逻辑,因为是对合并前两条流分别进行处理。

并且这个Connected流能够直接调用keyby进行按键分区操作,得到的依然还是一个connected流。值得注意的是要求这两条流中的键值必须是一样的。

此外,Connect还能够帮助广播流进行连接,在声明出广播流的时候,可以调用Connect方法将两条流连接在一起。然后按照是否为keyed流进行各自的处理操作。


4.联结(Join)

联结Join是比之前union、connect更加好用丰富的功能,它能够按照传入的两条数据流中key相同的数据做匹配处理,然后针对匹配成功后的数据做相应的操作,某种场景之下,它比connect还要方便。并且也正是因为它能力强,所以花样也比较多一点,可以分为:窗口联结、间隔联结、同组联结,接下来咱们就分别进行一下讲解。

4.1 窗口联结

故名思意,窗口联结肯定是与窗口相关的操作。在这种计算逻辑下,是将要联结的两条流中的在一个窗口范围内的所有数据进行join计算,它是将窗口范围内的所有数据做一个堆积,然后在窗口触发的时候做笛卡尔积判断,所有join上的数据才回去调用窗口联结函数apply方法中传入的计算逻辑。具体的模式如下:

stream1.join(stream2)
    .where(<KeySelector>) //主流的key选择器
    .equalTo(<KeySelector>) //辅流的key选择器
    .window(<WindowAssigner>) //窗口选择器,会话、滑动、滚动
    .apply(<JoinFunction>) //传入匹配上的数据的处理逻辑

4.2 间隔联结

窗口联结能力很强,但是会有个弊端,那就是如果网络延迟的事情发生,导致本来能匹配上的数据正好卡在了两个窗口的分界线上,那岂不是悲惨?所以就引入了间隔联结的方法,来维护错误场景的出现。

那间隔联结具体是怎么使用的呢?在join操作的时候,是有两条流的。如果网络发生延迟,或者业务本身有延迟,那进行window join就会发生要匹配的数据刚刚好的卡在两个不同窗口里面,就导致匹配失败。所以这个时候使用间隔联结,来针对主流的每一条数据的时间戳,在辅流上开一个范围,使得每一个主流中的数据都能够对这个范围的所有辅流中的数据做匹配,一旦匹配成功就会返回,然后被处理函数处理进行计算。具体的使用方法如下:

stream1
    .keyBy(<KeySelector>)
    .intervalJoin(stream2.keyBy(<KeySelector>))
    .between(Time.milliseconds(-2), Time.milliseconds(1))
    .process (new ProcessJoinFunction<Integer, Integer, String(){
        @Override
        public void processElement(Integer left, Integer right, Context ctx,Collector<String> out) {
            out.collect(left + "," + right);
        }
    });

4.3 同组联结

这种联结方式与window join非常类似,但是又比它灵活。它是在窗口的范围内,将这一窗口范围内的数据集传入到处理函数中,然后通过自定义逻辑的方式进行匹配,什么数据要保留,什么数据要消除都由开发者来进行。也就是说,它能够实现窗口函数和间隔函数这种inner join 无法实现的left join 和 right join以及outer join等操作。

stream1.coGroup(stream2)
    .where(<KeySelector>)
    .equalTo(<KeySelector>)
    .window(TumblingEventTimeWindows.of(Time.hours(1)))
    .apply(<CoGroupFunction>)
//在实现方法上也和window join差不多

5.结尾

在本文章当中,主要表明了Flink中多流转换的这个功能,如果认真看的话会发现我说的话都很直白,很容易被理解。鉴于我在本章当中提到了窗口,那就在下一篇文章当中,聊一聊与窗口有关的内容吧。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容