00:01
好,那我们来这个分析一下吧,啊,就这个问题呢,现在应该怎么解决啊,呃,那我目前的想法是这样子的啊,就是。来我们这个解决啊。就首先啊,首先使用这个for after drawing对吧,首先呢,先去使用这个for up join啊,然后呢,保证这个数据啊,都能保证这个join成功,或者什么这个或者没有成功的数据啊,都出现到结果中啊,出现到这个结果中。对吧,这是我们首先要去做的。能理解吧,来,那我们就写一下啊,咱们写的就是all in for,然后呢,K的。然后呢,叫fall of drawing,好,接下来就什么叫all detail。呃,TV的stream好拿回来,拿回来以后呢,这就是我们的这个叫做order drawing的一个什么stream。
01:07
Re。好吧,你注意看了啊,现在我们结果就不一样了啊,你看如果说你直接用的是这个join的方式,它给你返回的结果就是order in for order detail。对吧,因为什么?因为装是装易成功的数据我才会返回,那既然你能够装易成功,那就表示这两个一定是有值的。但是你看我用了这个four up以后呢,它给我返回的是一个option option里面呢,我又套了一个这个order in for,或者这个order detail。能不看明白,那既然你是一个option option表示它有可能有,有可能是没有的。所以说呢,诶这里面你将来再去做分析的时候呢,你就要什么,先判断它里面有还是没有,如果说这两个都有,那就说明我交易成功了,对吧?如果说这两个这个没有,这个有说明什么?说明就是你的订单详情表没有找到订单表,如果说他有他没有,那就说明什么,你的订单表没有找到你的订单详情。
02:02
明白我的意思了吧,啊说这个option这个就很关键了啊OK,行,那你说我保证这个数据呢,留下来了,留下来以后你接下来怎么办呀,你确实是没有装印成功啊,那你怎么办呢。对吧,你怎么去处理,你怎么去解决这个问题啊。想一想同学们怎么处理,怎么解决这个问题啊?啊。那这个时候你要去想明白哈,我们问题的根本原因是什么?根本原因就是错位了,对吧,数据错位了。是不是你看啊,比如说呃,来这个我简单画个图给大家去分析一下吧,啊分析一下。好,我们简单画个图啊来,呃,就是这个双流招影啊。
03:02
OK,呃,那现在我们是有两个理由啊,同学们有两个理由,我就拿这个箭头呢,表示我们的理由可以吧。啊,这是我的两个理由啊。这就这样。好,然后呢,写个名,写个写个字啊,这是order info。好,来,这是我的detail。好注意了啊,然后呢,呃,我们拿这个呀,拿这个来去表示我们的这个批次啊,这是我们的一个每一次计算的一个批次啊。行,我就给个颜色啊,给个颜色这是绿的。随便给颜色啊。
04:02
好,这是我的,呃,黄的吧。行吧,就这样啊,来这个是表示我的这个不同的批次啊,这是一个批次,这也是一个批次,这也是一个批次,能明白我的意思吧,啊,这是不同的批次啊,不同的批次,呃,我标识一下吧,啊标识一下。好,这是我不同的批次啊,OK,然后接下来我们就要去分析一下了啊,就现在我们订单订单这个数据和这个订单详情的数据呢,我们会什么呀,正常往后去采集,好,那假如说呢,现在我们来了一个这个就是OIOI啊O能明白吧,就是我来了一个什么order info的数据,那么正好呢,诶你在对面呢,我来了就是OD,就是我这个order detail的数据。
05:00
对吧,如果说他们是什么出现了这个同一个批次中的。能记得吧,他们是出现了这个同一个批次中的,OK,他们两个就是一定能够什么招新成功的。你能理解我的意思吧,好,那就怕什么事情,就怕是这样的一个事情,就是我的假如说啊,我一个订单呢,我对应这个一个订单啊,我对应的这个两个两个这个订单详情,好吧,那你这个地方你来了一个,然后呢,因为延迟的问题呢,我的另外一个订单详情呢,我进入到了下一个批次中。对吧,本来的话,你看他们这两个是要什么跟他去做关联的啊,来我把这个颜色改一下,就表示他们要关联的啊,关联的颜色就改成改成改成什么颜色改成红的吧。对吧,就表示啊,本来他们是要去做这个关联的,但是呢,因为什么呀,因为我的这个数据延迟了,他跑到了什么这个这个这个批次里面了,那么他们两个正常关联成功了,但是呢,这个数据你再去关联的时候,发现对面对面有对面有这个OI吗?对面没有这个OI了。上个批次他已经消费走了,那你就关联不成功,那你关联不成功以后,这个数据肯定就没了呀。
06:02
对吧,按照刚才情况来讲,这个数据肯能就没有了,对不对啊,那么同样还有一种情况就是这样子的,什么情况呢?你看了哈,我们。注意啊,还有一种情况这样子的,就是我还有一个OD。这个我再换个颜色啊,这个稍微。大一点点啊。表示这个批次是一样的啊来就还有一种情况啊,什么情况呢?就是呃,我们有一个OD,这个OD我要换一种颜色了啊,换成绿的啊这这这不是绿的蓝的是吧?啊这个OD呢,注意啊,他跑得快,你能明白吗?他跑的注意颜色不一样啊这表示另外另外一个订单的啊这哥们呢跑得快。对吧,他先跑到这个批次中了,然后呢,它所对应的OI呢,在这。
07:00
你能明白我的意思吧?就他们两个也是错位了啊,没有在在同一个批次中。啊,当然我说这个事情啊,主要想告诉你,就是有可能呢oy先到,OD呢晚到了,有可能呢OD先到了,Oy呢晚晚到了,就反正就是没有在对的时间碰上对的人。了解吧,总是这个错,错那么一点点时间啊,只要你是这种情况了,那对不起,你们都招运不成功,现在。是吧,都招引不成功,那么刚才我们直接使用是这个叫做招引,就是内连接,那就更不用说了,他们两个招引成功了走了,到了这里面以后呢,他一看对面都没有对的人,这两张数据我直接扔了,就我就不要了。然后这个哥们来了,一看呢,对面也没有对的人,好,这个数据直接扔了不要了。是不是?这肯定不行啊,我们改成这个就是fourout join以后呢,你们两个join成功了,那还OK,你们在对面没有找到对的人,但最起码呢,我这个数据是不会扔掉的,我会把它放到我的结果中,只不过这个结果的话,它是一个残次品,你不能直接去用。
08:01
对吧,同样这个地方也是它没有装印成功的,这个数据我不会扔,我也把它放到结果中了,这个结果呢也不能用,它是一个残次品。明白我的意思吧,啊,他也是个蚕丝林啊,最最最起码保证我的数据是能够保留下来的。好吧。行,那保留下来以后,你接下来做什么操作啊,你可以去这个设计一下啊,我们一会儿来去分析这种情况啊,大家可能也在去想另外一种情况啊,这种情况我我其实不计划去说的啊,因为他这个根本就不行啊,但是有的同学可能会想到啊,什么情况呢?就是我画完这个图以后呢,你这个忽然啊,豁然开朗,那很简单呀。我是不是只要考虑把这个批次给他往大了调一调?对吧。就相当于啊,你们是同一个批次,这样的话你看看啊,如果你会延迟的话呢。那我只要我的批次大一点,我从原来的五秒钟改成十秒钟。大概率情况下,你的延迟不可能超过这么大吧,你是不是也能够放到一个批次中的,是不是也能够遇到对的人了呀?
09:05
能不能看明白同学们啊,但这种方案治标不治本啊,因为万一说你说你十秒钟一个批次,我的延迟真的就大于十秒钟了呢?对吧,比如说来这个数据。是不是你看它就不在一个批次中。理解吧啊,说这个是治标不治本的啊,说这个事情你要知道的啊,那么还有同学可能会想到什么呀,就想到那个什么窗口操作啊,窗口操作就是说什么呀,你批次呢,还是这五秒钟一个批次,五秒钟一个批次,但是呢,我可以给你开窗口啊。对吧,我给你搞个窗口,那这个可能有的同学就更更加不知道什么意思了啊。我给你搞个窗口,胆子太大了。太大了。好,来,我给你搞窗口。行假设啊,这是我的那个窗口啊,那你看啊,我可以这么去做呀。我给你开窗口。你批次呢,还是一个批次一个批次的数据,但是呢,诶我要开窗口了,那我开了窗口以后,比如说我的我的窗口大小是两个批次的数据,那么这样的话呢,就算你已经算完了,但是这个数据呢,还没走,还在我窗口里面待着,那你下个批次过来以后呢。
10:17
我是不是还能够在遇到这个之前的人啊?对吧,就什么,他虽然说没有看到你,但是呢,我还在这个窗口里面待着呢啊,我等等你对吧,我等到你以后呢,诶你看我们两个一装一不就完事了吗。对吧,窗口也能解决这个问题,但是窗口的话会带来什么一个比较严重的问题,什么严重的问题呢,就是他们这个批次呢,装易成功一次了,对吧,然后呢,你又来了一个批次。这个时候呢,你整个数据呢,都在这个窗口中,那我再去装印的时候呢,相当于他们还要再去装一次。就是你要去考虑这个重复数据的这个问题,明白了吧,就最后你这个全部都招新成功以后呢,你还得去做这个去重操作,因为你相同的数据有可能会招新多次。
11:01
好吧,同学们,这也是一个问题啊,再一个问题就是还是刚才说的那个,你说你窗口开多大呀。对吧,你窗户开多大呀,你比如说啊,比如说。极端一点。对吧,就是你。对应的三个人出现了三个批次中,那比如说你的窗口开了两个批次的大小,那你只能保证他们两个装移成功,你跟他能装移成功吗?不能因为你的窗口要移动下一个批次到了这个地方了。下个批次是这样子的,这样子的话,你看一下他同样是找不到对的那个人的,找不着您已经走了。对吧,那你就想着说,那我把窗口往大了搞,搞这么大。对吧,那你搞这么大,万一说我更极端的情况,对吧,多极端呢。这样的。是不是,反正就是不在你这个窗口里面,因为数据延迟,你是没有办法去决定说你延迟多长时间的,对不对啊,所以它也是一个治标不治本啊,就是我能够大概率情况解决你这个问题,但是呢,要从根本上解决还是很难的。
12:04
啊,而且这个窗口的话呢,会带来更严重的问题就是你。数据量呢,会什么呀?会这个数据会重复啊,就是你这个会招新多次,那你最后还要去做一个驱动操作,而且你这个窗口的话呢,你的窗口范围越大,那我要去维护你的状态,你比如说你的这个批次,你做完以后呢,数据还不能走,我还得给你维护起来,跟下个批次呢,再去什么整体做一个招引,你的窗口范围越大,那我要维护的东西就会越多。这个是得不偿失的啊,同学们。好吧,这个得不偿失啊,所以说呢,这两种方案呢,其实我就没办法没计划去说啊,但是刚刚一想,呃,可能有同学会这么想哈,所以说我还是把它这个说一说啊,这两种方案不是很靠谱的啊,说把它干掉不要了。OK,接下来我们就说一下这个靠谱的方案啊,同学们。靠谱的方案呢,还是基于我们刚刚分析的。什么分析在的,你看了哈,就是你还是一个批次一个批次去做这个招引,那么我们大概率情况下就是你在不延迟的情况下,你的数据在同一个批次中都装移成功,然后呢,就可什么发走了。
13:06
对吧,那如果说诶真就会出现这个出现了不同批次的数据怎么办呢。这个怎么办啊,同学们听好了啊,我们这么去做。如果说你想的说,那我有可能有一个OD呢,会在下个批次中出现,那我是不是可以考虑让我的OI呢,等他一会儿啊。能明白就等他一会儿。好吧,那同样呢,这个OI呢也想了,诶,我可能上个批次中有人在等我。对吧,可能上个批次中有人在等我,那你看啊,他不仅要跟他这个同批次的数据去做,去做这个招音操作,那么他还得尝试着去看看有没有人在等他。的,以及呢,他还得去等下一个人。能不能听明白,同样啊,这哥们也是一个道理的啊,这哥们一个道理,你看啊,他来了,他说诶,我如果说招音成功了,那我走了,如果说我没有招音成功的情况下,就有两种情况,我对应的那个人还没来,或者说我对应的那个人呢,找到了,他在等我。
14:12
那我就看一下有没有人在等我。对吧,或者说我看一下我需不要等下一个人。这不就OK了吗?就说白了,我们把没有装音成功的数据呢,作为一个什么状态的一个维护理解吧,然后呢,我的每个批次的数据呢,我把这个装一操作的话呢,都分成什么,分成三步,就你同批次的出去做招引,还有什么呀,还有就是跟你的就是你的这个order info啊,你的order info跟状态里面数据做招引,然后你的order detail跟你状态里面数据做招引。这样的话呢,我就可以解决不同数据,就是解决什么解决你这个数据呢,出现到什么这个不同批次里面的这个问题啊,这个你可以叫什么叫这个错位匹配啊,错位了对吧,没有什么出现到这个对的时间内。那我也能够保证什么,你能,你们能够什么正常的关联成功。
15:00
理解吧,所以你看我们的思想就是这样子的啊,那你如果说想要去维护这个状态的话,那怎么维护呢?注意啊,你千万不要去使用这个Spark那个状态啊,他那个状态其实做的是很不好的啊,可能有同学已经忘了啊,那我就不再去多提他了啊,我不要用它,我们用第三方的状态怎么做呢?还是使用我们这个red啊,你看了呃,拿一个这个过来。再搞个颜色,搞个啥颜色,搞个啥色呀。呃,绿的有了吗?绿的有了呀,搞个这个色。OK吧,搞个这个色啊,这个色好看啊。行,你看了啊,就是我在它们之间呢,呃,架了一个桥梁。对吧,这是什么呀,这是我的这个叫做。对吧,这叫你看我做什么事啊,就相当于我的这个数据来了以后,这个数据来了以后呢,他们两个。听完了啊,他听完了啊,他们两个呢,诶先正常招引,如果招印成功了,那你把招印成功的数据了,你就可以写走了,但是呢,对于这个OI来讲,你要想明白了啊,因为OI对OD是一对多的,所以说你并不能说他们两个装移成功了,你就认为他的任务结束了,并没有他是可以同时约多个人的,你能明白吧。
16:20
同时可以预约多个人的,所以说呢,他是一定要做什么操作呢,就是我在同批次招一成功以后呢,我要把它呀,放到我的这个缓存中。明白吧,因为有可能他约的另外一个人在下个批次会去找他。那么同样的道理,对于我的这个OA来讲的话呢,因为你可以约多个人,那你可能你约约的那个人呢,比你找到了在上一个批次中的,那你是不是也得尝试着到你的到缓冲中去找一找有没有人在等你吧。对吧,所以说它有两件事儿啊,就是要把自己呢写到缓存中,然后呢,再找一下缓存中有没有人在等他,就对于我这个OI的处理,那么对于OD的处理来讲是这样子的啊,比如说我的这个OD,诶我在我同批次中,我招一成功了,那他的任务就完成了,就走人搞定。
17:09
听到了吧,走人就完事了,因为你的OD对OI是一对一的,就是我的一个OD只能对应一个OI。那我既然我已经跟对的人去。交易成功了对吧,就已经约完了,那你约完以后那就结束了呗。你甭指望的时候我再约个别人,不可能的。听到了吧,啊,但如果说你看啊,这种情况,我没有招印成功的情况下,我没有招印成功的情况下,那就只有两种情况,一种是他约的那个人比他早到了。对吧,还有一种情况就是什么,他约的那个人呢,比他晚到了。那我就可以干嘛呢,我就可以让他呢,到什么呀,到我的这个缓存中去找找有没有我约的那个人,如果有,诶你看他们两个又装印成功了,那我就先走了,就走人完事了,如果说我没有招音成功的情况下,那我就要干嘛呀,就就就拿他你看啊,像这个我到这里面一找有人有有人吗?没有人对不对,那我就写到缓冲中,我等等谁呢?等我要约的那个人。
18:13
那你看我下个批次来了以后呢,这哥们就想了,应,应该是有人在等我过来一看,诶,成功了。对吧。所以你看我们整体的思想就是我们会通过一个第三方的一个什么主件,然后呢去维护这个状态,就是把没有招音成功的数据,我们暂时给他维护起来,那么你后面的这个批次呢,就可以到我这个所维护的这个。状态中的,去找找有没有跟你对上眼的那个人,如果有的话,那你们两个一拍即合,哎,招引一下搞定。对吧,这样就可以解决这个。实时处理过程中双流招引这个错位匹配这样的一个问题啊,当然这只是一种方案了啊,其实也可以有别的方案。对吧,如果说我们将来使用这个link的话,那就更简单了,Link就根本不需要你这么去做了,他的那个状态管理是可以直接去用的啊,这个Spark那个状态管理,呃,问题比较多啊,就是会出架构的问题,什么这个小文件问题,然后代码不能更改问题啊,我们就不用查啊,我就不想去提他。
19:14
好吧,行,这就是我们这个。双流招应啊,我们解决这个数据延迟问题,来把我们刚刚分析的呢,我简单这个代码中给大家去总结一下啊,呃,那应该是这样子的啊,就是我们刚刚想到这么几种情况啊,就是解决方案就是第一种。就是扩大什么呀,扩大这个就是采集周期对吧,但这个东西啊,治标不治本对吧,治标不治本啊,因为你没法确定你的数据,你敢你一定能够保证在多大的一个周期内都进来吗?不敢保证,除非说你24个小时。对吧,我的一个周期24个小时,那你说这个东西你还搞啥事实呀。你搞离线得了。对吧,好,再一个就是什么使用这个窗口啊,使用窗口对吧,这个东西也是啊,治标不治本。
20:07
对吧,而且呢,而且这个问题比较大啊,就是这个,呃,还有什么还要考虑,还有什么考虑啊,考虑啥东西呢?考虑这个就是数据去重对吧,然后呢,这个Spark状态问题啊,Spark这个状态维护问题,状态维护的状态,状态的这个问题啊,状态的这个缺点。对吧,说都不行啊,那我们第三种情况就是什么呀?就是首先我们使用这个东西,先保证我的数据呢,都能够出现在结果中,然后接下来呢,干嘛呢,就是将没有,就是将这个呃没有这个招易成功的数据啊,呃不能这么说吧,因为我们的这个order info的话呢,你不管招印成功还是不招易成功,我都得去写缓存对不对,好抽到这个结果中,然后呢,呃,我们要干嘛呢?就是让各自啊,让双方都。
21:01
都什么都多做一步操作啊,多做一些操作,多做两步操作,两步操作啊,多做两步操作,哪两步操作呢,就是到缓存中。对吧,找对的人对吧,还有一个是什么呀。把自己写到缓存中。对吧。就这么个事儿啊,我们的思想就这么简单。明白吧?好来,呃,这个我们就分析到这儿啊呃,如果说你这个还不理解的话呢,呃,我这个文档中呢,其实给了一个图啊,大家可以自己去读一读,来我既然我都画完了,画完了以后我们就看一看吧,好吧,要不这个白画了是不是?在这来把它打开啊。好,你看了哈,我们最后把这个图过一下啊,这是。Order info和order detail,那么他们两个呢,先去做这个drawing,做的是for after drawing,然后呢,接下来我判断你的这个order info有没有。
22:05
就我先看你的,因为结果中啊,结果中有这么几种情况,就是他有他有。对吧,他没有,他有,他有他没有。那我就先判断他有没有,如果说他有的情况下,那我再判断什么,判断他有没有,就澳洲底下有没有,如果他们两个都有,OK,那就招易成功了,直接写入到ES。或者你把那数据什么先给他维护起来啊,那如果说。什么呀?有的情况下,他也得把order info转换成什么摘写入到缓存中,然后再一个呢,我还得到缓存中查一下是否有detail,就说白了,有没有人在等我,如果说诶,你看有,好,那么他们两个装一成功走人。啊,如果说它没有的情况下,那么一定是奥底特要有,因为不可能两个都没有啊同学们,你两个都没有那是啥结果呀,对吧,它一定是有,它有的情况下,那么它也是先干嘛呀。查询缓存中有没有有人在等他。对吧,如果说有人等他,OK,关联成功走人。
23:03
听明白了吧?同样呢,他其实如果说缓冲中没有人在等他,那就说白了,我不可能是孤零零一个人的,既然没有人在等我,那我就知道了,我要找的那个人还没来,那我得去等等。对吧,说他要去写缓冲,然后去等那个人。听明白了吧,就是这么一个过程啊,大家把这个流程呢,自己去呃,想一想啊,想想这个细节。好吧,然后呢,再去想想怎么把它转换成我们这个代码,去把它这个实现出来。OK吧,来这个分析呢,我们就先分析到这儿啊。
我来说两句