00:00
好,接下来我们来看一下map reduce数据倾斜问题。呃,你把这个MA6抛掉,其实啊,在我们后面除了这个MAP6之外,还有呢,像have。数据倾斜,Spark数据倾斜以及呢link数据倾斜,比如说所有的计算引擎类的这种框架都涉及到一个数据倾斜的问题。那什么叫数据倾斜呢?其实啊,就是你正常,这是map阶段倒数第阶段。其中某一个任务运行非常缓慢,大部分任务都结束了,只有部分任务没有结束,那这种场景其实就是数据星星。那通常情况下数据倾斜呢?是发生在review阶段,给大家看一下生产环境上的一个截图。嗯,这是某公司内部的程序啊,它在运行过程中啊,发生数据倾斜,让大家看一看数据倾斜长啥样。哎,就这样。你看一下啊,这里面他跑的是map程序,跑了多少25个map程序,然后其中呢,这是REDUCE3 reduce4,应该还有reduce啊REDUCE5对吧,那它前面应该还有REDUCE1REDUCE2啊,这么多reduce。
01:13
但是你看一下其他的任务都已经success,比如说结束了,就还有两个任务仍然是在running,比如说RADIO3 radio4在软井程序已经运行了多少呢?运行了99%。哎,这个99呢,是一个非常明显的一个标记哈,也就是说程序运行到99%,大部分任务已经完事,还有部分任务没完成,始终卡在这儿,而且运行的时间非常长,那这就是发生数据倾斜的一个明显现象。那发生了这种现象怎么办?怎么来解决?有同学说还给我等,我就等着他把这个最后这个任务执行完行不行呢?啊也可以,但是这个呢,要等的时间太长了,可能就说等一天等两天都有可能。对吧,哎,我们还是要通过呃这个代码把它改掉。
02:01
那如果说发生以上情况,你需要从几个方面去入手,第一个首先检查一下你的数据是否有大量的空值,尤其你这个K是否产生大量空。你思考一下,为什么说有空值呢,它会产生数据倾斜呢。你看。这是这么多map对吧,那如果说你这个K它是一个空的,它会聚合到同一个reduce面对吧。往往在企业里面,其实一个空值反而很多。导致你这个reduce它执行的时间非常长,其他的任务呢,正常执行就结束了。哎,第一件事先讲检查这个空值,如果检查到空值之后,你有两种处理办法。第一种这个空值我直接过滤掉。哎,这很正常啊,你像你这个K核心的这个K它都是空的,那我后续会用这个数据吗。哎,其实用的比较少。那万一说我就想用这个空值为这个K为空的这个数据怎么办。
03:00
那也简单,你只需要在自定义分区将你这个K是空的数后面加上12345类似这种数据,那他未来是不是这进入一个分区,这进入一个分区,这进入一个分区,这一个分区。你想把你这个空值分成几份,那你就加上几个实际数。能懂这意思吗?I修改它K对应的值随机加。OK,那他就打散了。那打散之后,那这个最终不是我想要的数据啊,我最终还是想用这个now对吧?啊控制为now的这个进行一个获取处理,那你再将这四个。数据再进行一次reduce,这叫二次聚合。哎,分阶段的一个处理OK吧,好。这是这块第一种方式,那第二种方式呢,是在能在map阶段提前处理掉的,尽量在map阶段处理。比如说这个,它就是相当于在map阶段进行了一个提前预聚合。对吧,那我就减少数据这样一个传输,比如说S硅五一。
04:02
艾特硅谷一,我这有100次。那如果提前预计和的话,那么其实我传过来之后,那就是爱股100。通过大量的这个减少了数据上的一个传输。那还有我能在map集团进行招引,对吧,那我就map招引这个案例,咱之前也讲过。哎,我把一个文件呢,呃,采用缓存的形式,缓存到这个内存当中。然后进行一个大小的一个招音。再有呢,这个地方一定要注意,你前面自定义了这个相的这个分区,那你这个reduce个数一定要增加增加上来。那也会减轻对应的数据信息的一个风险,你别这个前面采用了一堆办法,但是最终reduce就一个。对吧,那还是容易产生对应的数据倾斜。哎,这个数据量也尽量增加啊,那这块呢,其实这个呃,Hi do和MAP6的数据信息啊,并没有给大家详细展开啊,我们后面再讲have,嗯,Spark flink的时候会给大家再次展开啊,原因是什么呢?还是因为我们在生产环境下,这个MR程序写的已经越来越少了。
05:07
啊,那其实我们未来遇到数据信息的场景呢,往往是发生在啊,用have引擎,Spark引擎以及Li引擎啊,所以说那个才是我们的重点,那这里面呢,我们要从原理上了解数据倾斜怎么回事,那你要解决数据倾斜从哪几个方面入手就可以。OK吧,哎,好,这是map数据信息。
我来说两句