00:01
好,呃,那么在此基础上呢,我们还要去做这个优化啊,做这个优化,当然这里边儿有一个优化方案,大家不能忘了,就是增加变因度。对吧,增加并行度也是一个优化,这就是所谓的加机器啊,这种优化方式OK吧,好,嗯,那我们呢,假如说不想增加这个并行度了,那从代码的层面还有没有可调的空间呢?可以,因为当时我在问这个优化的时候,有同学,有一个同学也提出来,我忘了是谁啊。提出来这个多线程这件事,还有同学记得吗?对吧,用多线程。啊,用多线程,哎,那我们顺着这个思路来想一想,为什么多线程,呃。能够提高我们的一个效率呢,啊,那因为是这样子的啊,就目前来说呢,我们的数据是这样子啊,你A来了对吧,A呢发送请求这边呢。来举个例子啊,这边呢是咱们的数据库对吧,Phoenix也好,Red也好,现在的情况呢,就是说我们一条数据来了对吧,A来了,A来之后呢,它是发请求,诶我去查这个数据。
01:08
查数据以后呢,那这边是在等着,这边是在等着啊,等着之后呢,这边告诉你诶,我结果的给你返回了对吧。好,那你A呢,就拿到这个A加。补充的信息有了对吧,然后B呢,其实早就来了啊,B呢,可能已经到我这个map方法的一个缓存里,缓存区来了,对吧,但是呢,A没做完,你得等着啊,你得等着,等我A做完了,你这个B呢才能够去。发送你的请求,最后呢,诶那B呢,又拿到他的一个响应的,诶得到一个B加出去了,因为补充信息嘛,这个加号我们就相当于补充的信息,对吧,他这样的一个情况,那我们思考一下,为什么多线程可以能够解决我们这个问题呢?对吧,啊,那因为你看A来了,A发送请求,A创建一个线程,去发送一个请求,B来了,B也独立创建一个线程,对吧。我不用等啊,不用等,我呢,就是也同时发送了一个请求,那我俩一起等。
02:05
对吧,一起等的话,很有可能我B呢,在这个时候就输出了,而不是说在这个时候才开始发送请求。对吧,而不是在这个时候就开始发送这个请求啊,那这种方案在flink当中要怎么去实现呢?关键的问题在于啊。那也就是说你,那你用多线程呗,对吧,那我要告诉大家,在map这个函数里边,这个函数里边它不行。Map这个函数不行,因为map这个函数啊,就是。单一的。啊,就是你AB,假如说前后脚来的。对吧,挨的很近很近,就是A来了之后,B立马就到了,我请求可能还没来得及发呢,A这个数据读取为表的请求可能还没有发呢,你B就已经到了,但是对于map这个方法而言,那必须要等A处理完我才会去处理B,就算你想着,诶,我给每一条数据开一个独立的线程。
03:04
那没用。你懂吗?就相当于这个我们。就简举一个简单例子,相当于呢,咱们A就是写的开现成那个代码呢,它是怎么样,它加了锁了。这样说大家是不是能好理解一点,就是在map这个函数里边,对吧,所处理的这个东西好像加了锁这种感觉一样的,就是我第一条数据进来以后,我就持有了这个锁,然后呢,等我这个数据处理完了出去,你第二条数据才能再进来。对吧,所以你想如果说在这种情况下来说,我们说在map函数里边写,创建新的线程去读取数据,大家说有没有用啊。没有用,因为你这个县城呢,一次只会有这一个。他是挨个去创建线程的,对吧,他不是说,哎,你创建完线程了,我来了,我也创建线程,你这个线程还没有释放,我这个线程也创建了,他不是这种情况。啊,在map函数里边这个事情做不到啊,那没有函数能做到这个事儿吗?有。
04:05
有叫什么呢?异步函数。啊,有一个什么呢,叫异步函数啊,在这边我们给大家看一下啊。嗯。在这儿。这是旁路缓存的一个图解,对吧,就是我们说的判断为,那会怎么样啊好,那接下来呢,还有一个E补IO的一个函数。那么异步什么叫异步,什么叫同步?这个大家能理解吗?同步是什么意思?哎,我发个请求,我就得等着,对吧,等到这个请求响应了,我才去做其他的事。而E呢?那就不是了。对吧,啊,它可以实现这个功能,更重要的这个点啊,这个E步IO这个函数,它是一个函数啊,它也是一个函数,它不是说像诶是不是说EIO,你你你在这个函数里面去写什么东西没用,那你只要用了map函数,他就不可能说,嗯,两条数据同时处理,他做不到这个事儿啊,那首先呢,要用到这个一补IO的一个函数。
05:16
啊,它这个函数里边就可以做到一个什么事呢。做到一个假如说你AB2条数据前后脚来了。A,先发送请求对吧。好,A呢,正常的,这时候应该等着。等着之后呢,等着这个数据库给我们响应我们的结果。好,那B。同时,来了之后,他也会发送请求。我不用去等着你A完成。啊,它里边是这样子的一个机制,对吧,那这个时候呢,如果说我们用多线程用ebo函数对吧,结合多线程的方式,这个问题呢,就可以解决了。它跟map函数最核心的区别就在于,如果同时来了多条数据,Map它必须一条一条一条的处理,而对于一步L函数里边,它可以同时。
06:11
处理。啊,就是谁来了我就处理谁对吧?啊等至于前面数据有没有处理完。不用管你不用操心。对吧,那在这种情况来说呢,我们可以使用。多线程好,那我们来看一下啊,啊,这个呢,大家没学过啊,没关系,我们来看一下这个官方文档的一个介绍就好了啊,当然这边呢,也有一些文字介绍,都是从这个官方档当中改过来的,包括这张图啊,也是从这个官方文档当中去搂过来的啊,包括刚才我们说的啊。这个是同步对吧,A发送请求,这个是等待时间。这是等待,等待完之后呢,响应对吧,BA。发送请求,然后再等着再响应。而E呢,看。假如说你同时来了,哎,那你挨个顺序赶紧发请求,然后呢,大家好看起来是一起等着对吧,因为那个一毫秒绝大部分时间是这个时间。
07:07
啊,绝大部分是这个等待的时间,对吧,然后接下来呢,诶,你就谁拿到了谁出去呗,啊谁拿到结果谁出去对吧,那这样的话很明显我们压缩了这个等待时间,本来等待时间是要怎么样,是要累加的,现在不是现在呢,你同时来了五条数据,可能我这五条数据用。同一个等待时间就好了,对吧,那你之前呢,五个五条数据,那就是五个等待时间就是五倍的,现在呢,压缩成了一倍。对吧,压缩成了一倍啊好,这是我们所看到一个点啊,当然我们来看直接看这个官文档吧,就刚才我们看到那个图呢,在官方文档当中都有啊。我们打开这个内容啊。好还是切到咱们这个01:13这个文档。然后呢,呃。
08:01
叫data dream API对吧,这里边有一个operators操作,哎,这个之前跟大家提过,在聊join的时候跟他提过,对吧,那我们说这里边呢,像window。Process function这三个东西呢,我们都已经学习过了,对吧,而且呢,这个join也是在我们当前项目当中给大家去讲的,那接下来呢,我们就要讲这个。EL。啊E不IO的一个函数对吧?它啊,那这样的话,我们就这swim当中嗯些东西呢,都已经补全了对吧,点开点开好以后呢,哎,这应用引来呢,就刚才我们那张图对吧?啊,就是从宽风上粘过去的这个无所谓啊好,那我们来看啊。首先呃,第一个他说什么,说这个使用异步IO操作的一个。需求一个必要性,对吧,Need啊need啊好,那我们来看一下,他说当与这个这其实我们都知道,就是交交互的延迟比较高,我们来看一下啊,当这个与第三方数据库,第三方系统要进行交互的时候,对吧?他举了一个例子啊,For example。
09:06
当我们要丰富这个流里边数据的时候,对吧?呃,With date。In a database in the database,对吧?好,那在因为什么呢?当我们这个与外部系统交互指的什么意思啊?当我们需要存储在数据库里边的数据。对吧,然后来丰富。因为是嘛,对吧,丰富流游里边事件的时候,诶,这就是我们一个点应用场景,那当前我们这个关联微表是不是就是这种场景啊。我们要用为表当中,诶,Phoenix里边数据对吧,来丰富流里边的这个招聘,因为现在的很多都为now或者为空,我们不希望它为闹或者为空,对吧,我们要把它补充上啊,那说one needs to。Take care要注意注意什么呢?交互延迟,Delay。
10:01
对吧,交互延迟啊呃,与外部系统的交互延迟往往呢,会影响到我们什么。整个的一个工作。对吧,那我们如果不加red直接访问这个菲,那就更影响了,对吧,那一条数据呢。可能要。八毫秒。我访问一次就要八毫秒。对吧,这还是建立在。你呢,不是第一次启动,第一次启动可能也要120毫秒。对吧,那整个速度流的速度慢,都是因为你要跟外部系统,跟第三方进行交互而导致的。对吧,而导致的啊,好,那么这里边呢,大家看啊,他说如果说必须要跟这个外部系统交互,那for example ina map function,哎,在这个map函数当中啊,那么呢,它就意味着什么,Means,对吧?意味着同步的一个交互方式。啊,同步的交互方式啊,它同步怎么怎么同步呢?啊,当然这个呢,大家现在比较清楚,只不过说我们拿关公呢,再印证一下我们的说法对吧,他说a request对吧。
11:07
一个请求发送到数据库。啊,And。Thefu,哎,这map函数呢,With对吧?With,等着等着什么呢?Until。直到,直到什么呢?直到the response has been received。就是说我呢,发一个请求以后,我这个map函数呢,就得等着,你看它是map函数就得等着,那你第二条数据就算此时已经来了,他能处理第二条数据吗?它处理不了。它处理不了。对吧,他必须得等着第一条数据处理完,他直到等着等着直到n until对吧,直到我们这个响应response嘛,响应被接收到诶。才能处理掉下一条数据啊,呃,In many cases,在很多的案例当中,对吧?呃,当前的这个等待。会。你看他用了好几个这个巨大的。来表示这两个单词其实是意思相近对吧?啊,然后呢。
12:05
第味着它呢,这个交互延迟的一个开销,给我们这个函数的时间,对吧,就说提供了一个巨大的什么支持啊,类似于这样子的,就是说会影响到我们函数的执行时间,对吧,效率会变低啊,会变低这个意思。对吧,啊好,那如果说异步的交互的与这个数据库异步的交互意味着什么呢?意味着单个注意啊,单个比异步的一个函数实例,对吧,可以处理什么呢?Many request concu,主要是这个,它会同时处理很多请求,如果没有这个单词没有意思了,对吧?那我map意味着map不能处理多个请求吗?可以,但是map呢,一个一个处理,它呢,同时处理conculy。对吧,And receive the responses,哎,其实说这个响应哎也加了ES对吧,复数啊。同时去接受多个响应。啊,从而接入这个显性,这是我们说的异函数的一个好处。
13:02
对吧,啊,这是他的一个介绍啊,当然你在下面我们不看了啊,就是说他。可以去呃,同时发送多个请求啊这些东西对吧,啊啊,它意味着这这个方式呢,意味着这个我们更多的案例可以拥有更高的硫的吞吐量。啊,留存的存量会变高,那必然的,对吧,我一我同时处理的数据量变多了,肯定吞吐量变大了啊好,那呃,当然这个有一个注意事项啊,大家要注意一下。啊,他刚刚我们注意了,注意什么东西呢,他说要提高这个吞吐量,嗯,如果说我们。在这个调用是吧,Map函数的时候,想要去提高这个存储量可不可以呢?也可以对吧,那我们可以用一个非常高的必度,这就我们说的,如果说你当时我们不是给大家举例子嘛,就说你一秒钟呢,如果能处理个100条数据,那我想处理1000条对吧。我就十个病毒,我想处理1万条,我就100个病毒呗。是不是我们可以通过提高变度的方式来解决这个问题啊,对吧,啊这是可以的啊,这个这是一个优化方案啊,你不要忘了这个,你不要觉得他哎搞笑对吧,那咱那怎么提高便异度这种方式都都能说出来,那你想想看,对于我们之前举的例子,双11对吧,像这个阿里。
14:17
或者京东这种平台人数用户量特别高的那种平台,到了双11的时候。那那个数据量非常大,你说你从软件呢,你代码写的很优秀,我做123455种优化,对吧,你能处理那种什么上一条几十亿条数据每秒的情况,那也不可能。那也是不可能的事情,对吧,那我们要通过什么呢?通过这个。加硬件的方式。你硬件上的突破对吧,所以呢,这也是一个优化方案啊,但是呢,呃,他他继续说了对吧,但是呃,通常会带来一个很高的资源开销对吧?Resources cost资源开销啊,那拥有很高的一个并行度。
15:00
Map函数的一个实例呢,意味着更多的任务线程。啊,然后呢,Flink。Network connection,还有更多的内部的网络交互,对吧?啊,与这个数据库的网络交互,还buff缓存啊,这些东西都会相应的,怎么样提高啊,这个我们必然清楚,就是说呃,用加机器,当然。需要消耗这个资源了。对吧,啊,需要消耗自己的资源了,OK,这个是没有问题的啊好,这是我们所看到的,就是说在弗link当中呢,它有一个异步IO这样的一个操作。可以帮助我们提高。吞吐量啊,可以帮助我们提高吞吐量,在现有的冰度的基础上。去提高,假如说你不想修改这个变异度了,对吧,那我们可以用这个EIO的一个方式来提高我们整个的一个吞吐量,就是压缩等待时间。啊,他要去压缩这个等待的时间。对吧,就本来呢,你第一条数据来了。
16:02
发送请求。等着响应。对吧,然后再处理第二条,现在不是了,现在你要两条呢,来了,我直接两条都发送请求你俩同时等着。那必然效率会提高,对吧?啊这意思好,这是我们关于EIO的一个简单的介绍,一个说明,对吧。
我来说两句