00:00
那接下来我们来聊一聊一个重点啊,数据倾斜也是咱们在日常开发当中啊,非常常见的一个事儿,那数据倾斜咱们分几个思路来了解,第一个呢,它的现象长什么样?这个很简单,咱们可以在Spark的word UI上面看它的一个v call使用情况,也可以看到task的执行时间,这都可以,一会呢,咱们也可以去通过咱们的案例去观察一下啊,那现象就是绝大多数的task,它运行的速度很快,也就是说它的时间啊,像这个时间。普遍比较短,总有个别部分的task,它执行的时间特别的长,明显比其他的长了很多,那这种呢,就是一个数据倾斜了。那数据倾斜的危害呢,可能就这个task,可能跑着跑着就OM了,这个也是很常见的一个事啊,那造成数据倾斜的原因有哪一些呢?这个一般是由于咱们做发生的一个沙Le。
01:06
那最经典的,比如说咱们的group by key reduce by key。Red by key这种算子呢,都会给我们造成一个沙uffle,并且呢,按照一定指定的key进行一个哈希分区,那这样的话,如果有一部分的key它的数量极其的多,明显高于其他key的话,就可能产生一个倾斜的原因。那么还有一种常见的就是咱们在做join的时候,某一些join的key特别大啊,举个例子,两张表join其中一张表咱们以简单的场景来理解,有个ID字段做关联啊,这两张表啊,那其中一张表,比如说它这个1ID为一的有很多很多个,比如说有疑义的,那比如说为二的可能有一点点,有三的一点点,四的一点点,那看到这种数据明显这个一就是那个所谓的大K啊,就它的数据是大量存在的,那我们比如说小,呃,另外一张表,比如说它就是123就三条数据,那么一九引的时候。
02:08
这么多的一跟这个一做一个join,那这这个task课就会处理的时间会非常的长的啊,这就join的时候会产生的,那也有一种就是咱们单表的时候啊,比如说我对这张表,呃,然后呢,咱们写so的话,就是对ID做一个group啊,比如说group by ID,然后做了一个sum或者count这种,那么我们在处理。ID为一的这个分组的时候,它处理的数据量比就比较大的啊,基于这种场景啊,说白了就是沙啊。这个是咱们要了解到的一个,那接下来呢,教教大家怎么去做一个数据大体的定位,像刚才咱们是举了个例子对吧,那是咱们自己举例子,知道一是一个大K,但是往往实际中啊,你怎么知道到底是哪一个T,它的数据量比较多呢?这个就需要咱们去采样抽样啊,那假设呢,咱们现在已经有一个数据倾斜的场景,呃,那咱们现在就要去对这些key做一个定位啊,怎么来定位呢?咱们这边给到了一个DEMO。
03:22
啊,这个类采样器的一个DEMO,其实采样的方式非常的简单啊,那这边呢,大家可以看到我是封装了一个方法啊,这边呢,传的是一个表明一个是。列明,也就是说咱们想要去抽样的那个T啊,那咱们执行的申索尔也简单了,咱们查出这张表。我只查出key这个字段就行了,其他字段咱不需要,对不对,那之后呢,我对他做了个啥事呢,你看。查询这个key,然后调用一个sample算子对它进行采样啊,然后呢,比例这个咱们可以看情况去调,我这边是抽取10%的数据,咱们也没必要对所有数据进行一个呃,统计嘛,采样大概的估算一下应该就能看出来,转成一个RDD啊,不放回,然后呢,转成一个二元组啊。
04:21
就key的值,然后后面拼接一个一调用了一个reduce by key,那这样呢,我们就可以统计出在抽样的key里面啊,每种key的出现的次数是多少,再之后呢。咱们对这个得到了一个原组,比如说咱们得到的是呃T1,然后统计出来是1万啊,是这么一个数据对吧,长这样,然后再紧接着我对他俩调换的一个顺序,就得到了1万。呃,KEY1其中某个K嘛,K1表示其中某一个T,然后再调用sortt by key,根据这个统计的值做一个排序,做一个降序,那这个时候咱们是不是就可以取到前面呃,最多的十个T啊,对吧?呃,然后再取TAKE10,就TOP10最多的K,那基于这个算抽样算法呢,咱们就可以去统K到底是哪一个K造成的倾斜啊,也是很简单,这个方式也很简单啊,那在这里呢,我对咱们使用到的三张表啊分别进行了采样,那由于咱们后面要演示一个join场景的大key问题,对吧?那我这边就对每张表的关联条件进行了一个采样,比如说这张表,呃,Csc咱们抽样了两次,因为它跟其他表关联的时候,一个是要用Co cos ID关联,一个要用all的ID关联,所以对于这张表两个字段,我。
05:51
都进行了抽样,那其他的表呢?像SC就是那张c Co另外一张表对吧,就这张表,呃,咱们只对它的一个关联条件cos ID进行抽样,那CP就是这个cos配只对关联条件or的ID进行抽样啊,这些都是咱们关联时候要用到的key的列名啊,那都是调用咱们封装好的这个方法。
06:18
那抽样的话我就不去,呃,执行执行了没啥必要啊,这个没什么压力,执行这个咱们直接本地执行。看一下效果,这样打印看得更清晰一点啊。采样结束了,我们挨个来看一下啊,Csc这张表,也就是这个表啊,这个表咱们对cos IDE进行了抽样,那我们可以明显的看到cos ID 101跟103这两个值是不是数据量明显大于其他的那个cos ID啊,对吧?咱们交换的顺序嘛,右边是一个key值嘛,右边这个才是key啊,那你看从这个就很直观直白看到了,对于这张表而言,它存在两个大key,一个是101,一个103,就是这个cos ID字段,这个也是咱们造数据的时候故意让它出现的现象啊,那通过这个方式咱们就能够很方便很直观的定位到大T,那其他的咱们同时来观察一下啊,呃,比如说另外一张表。
07:31
C cos的cos ID字段对吧。咱们对他抽样呢,可以看到它很均匀啊,抽样出来的这些key里面都只出现了一次啊,这个应该没有什么倾斜存在啊,没有什么大气存在,对吧,这个也很正常,再往下走,我这边标题都打印了,这个是那张表叫啥来着?CP对吧?Cospy对all的ID进行抽样啊,咱们是对all的ID进行抽样,那我们可以看到抽样得到的这些all的ID前十个都是一,那说明后面就肯定也是一了,它也同样没有倾斜,再往后最后我们对csc这张表啊,同样对O的ID又进行了一次采样。
08:19
我们发现,诶,他这张表的O的ID也没有一个。频繁出现的现象,综上我们是不是可以知道咱们的结论,对于三张表而言,对于这张csc的表,它的cos ID字段有两个值是比较多的,一个是101,一个是103,这个就是采样的方式,这个应该是非常用啊,非常好用,那么大家呢?像这个也可以保存起来啊,未来呢,出现了倾斜也不要慌,直接呢就把它替换一下,去看一下到底是什么样的key造成的倾斜,接下来呢,你就可以根据不同的情况来选择不同的处理方式啊,那咱们下面也会去介绍。
我来说两句