00:00
好的,那我们接下来看一下,我们第四章叫数据新写问题,那这个是。在生产环境当中老生常谈的一个问题,对吧?呃,那首先我们要知道数据倾斜,它所带来的一个现象是什么样子。啊呃,要注意它指的是绝大部分任务都已经完成,只有一个或少数几个任务执行的比较慢。啊,并且最终可以导致我们任务失败,那这一现象呢,我们把它称为数据新斜的现象,那要跟一个数据过量这种现象呢要区分开,数据过量指的是数据量过大,然后我们资源过低,导致的所有任务都运行的比较慢,但如果是数据过量,那没办法,我们只能提高我们的资源,但如果是数据倾斜。那我们就不一样了,好,那我们就思考一下数据细节,为什么会有少数几个任务执行的比较慢,或者甚至只有少数一个任务执行的非常慢呢?
01:03
为什么?因为我们这一个,或者说这几个任务拥有了绝大部分的一个数据量。对吧,那这个往往伴随着我们的一个沙佛过程当中,按照哈希进行重新分区的时候带来的一个问题。所以从这个角度出发,我们就知道,在我们写的四个当中,单表语句有。分组对吧,也就是说最终呢,我们可以分为单表当中携带了group by字段多表。有join操作,因为join呢也会引起我们的shuffle操作,只要有shuffle存在,那么就有可能会导致我们数据的数据倾斜。啊,所以一定要注意一下,那接下来呢,我们分开讨论这个问题,如果是单表数倾斜,那我们该如何处理,也就公办,那这个时候呢,要分两种情况讨论。那哪两种情况呢?你比如说呃,我举一个简单的例子,在我们一张表里边儿,假如说A数据有。
02:11
10万条B数据呢?可能有。50条对吧?好,C数据呢,又有这个10万条,D数据呢,可能是3万条啊,类似于这样的一个情况,我举个简单例子啊,这个50我们可以写一个5000对吧?啊5000好,那此时大家可以思考一个问题,如果说。我们分两个区。分两个区会怎么样?那按照哈希值A和C是不是进一个区,他俩呢,20万。而B和D进同一个分区,它俩加起来是35000。诶,以前最大的差值是10万跟5000差9500,那现在20万跟三万五之间差了165000,数据倾斜力度好像变得更大了。
03:11
对吧?那为什么要举这个例子呢?所以这个例子说明什么问题?在我们进行单表数据信息优化的时候,一定要明确一个点到底是单个K引起的数据倾斜,还是多个K引起的数据倾斜,因为这个时候呢,解决方案可以不一样。如果是单个K引起的数据倾斜,那么就跟我们之前所说的,在group by这个优化当中就跟大家聊过了,我们可以开启数据斜或者开启map端滤聚合,开启数据倾斜之后呢,它会生成两个。用第一个任务呢,将我们可以全部打散。第二个任务,再把这个K呢收集到一块做聚合,也就添加了一个随机数的方式打散我们的数据。
04:01
对吧,啊,这个呢,是适合单个K倾斜,单K或者多K都可以啊,单K或者都可都可以,也就是说它是在group by这种方式当中一个非常通用的一个方式啊,当然。大家有可能会聊到,那有很多的帖子或者说资料当中都写了,我们可以自己去添加随机数。但其实没必要,我们只需要知道数据信息之后,我们添加一个这个内容,它就相当于给我们添加了学习数,打散我们数据,那我们给我们。分组可以添加随机数是为了什么事?为的不就是打散数据吗?而他自己通过一个参数就可以打散数据,那我们为什么不用呢?对不对?好,注意这是单个K或多个K啊,那第二个问题就在于,如果是多个K,其实我们可以想办法提高reducer的一个数量。啊,可以提高reducer的数量,这种方式也可以,你比方说刚才我举个例子,Abcd,大家还记得数据量吗?
05:09
A呢,我举的例子10万条,这个呢5000条,C呢10万条好,那D呢是我们所看到的有这个3万条。好,如果说这个时候呢,我们分两个区,那么将会看到零号分区呢,20万条数据,一号分区呢是35000条。那它俩差值呢,在165000条,那如果说我分四个区呢,它是每人一个区,最大差值是不是在9000。啊,95000条。比刚才我们那个差值要小很多。要好很多,但是这个我们只举了四个数据,那你比方说下面还有什么E10万,F又是什么2万,如果说分两个区的时候,ACE是不是可能进到一个分区。对吧,那这样的话,我们多个分区之间的差距会越来越大,因为它们属于这种强强联合,正好分区数少的时候,我们多个K呢,进到同一个reduce里边,这是很有可能的,当我们把这个分数扩大。
06:15
把分区数扩大的时候,那往往呢,这个内容就变得不一样了,而且大家在扩的时候要注意,最好这两个数呢,不能是倍数关系,你比如说之前是两个分区,之后呢,变成四个分区可能不太好,因为可能这个两个跟四个呢,它又跑到一起了,对吧,那我们可以把它变成一个。它俩没有公约数,或者叫公倍数这样东西,公约数啊,那也就是说我可以重新分,分五个区七个区。九个区类似于这样子的,那这样的话会有利于我们打的更散,大家能理解这个意思吗?对吧?当然这是在多个K同时导致数据倾斜的一个时候啊,当然那有同学可能会问,那我怎么知道是单个K数倾斜还是多个K?数据信息很简单,我们可以做一个抽象,或者说统计一下每种K它的一个总条数就OK了。
07:13
对不对?好,这是我们所说的单表产生数据倾斜它的一个。
我来说两句