00:00
好,接下来我们看一下reduce task工作机制啊。这呢也是面试重点,那上来呢,Test呢,一共分为三个阶段啊,有分三个阶段呢,也有分四个阶段的哈,啊主要区别在于这个地方,这个地方呢,你可以叫so阶段,也可以叫me加thought。对吧,归并加排序啊,其实你弄一个排序也行行,那回忆一下这是呢,Map test对吧,把数据准备好,已经持久化到磁盘上了,等待re的拉取。那radio test闪亮登场,他首先干的第一件事儿呢,就是拉取自己指定分区的数据。那这叫什么阶段呢?叫copy阶段。上来先拉,哎,拉的过程。那这样或者是吧,那接下来我对拉取过来的数据进行一个规定排序。那这个是什么阶段呢?叫上阶段。那么拉取过来的文件进行合并。好,那接下来我要往这个reduce方法里面去写,对吧,相同的key进入到reduce方法,那进入到reduce方法里面的内容,那这块呢,其实就是reduce阶段。
01:07
然后呢,最终all put写出到文件那后面这块reduce。比较简单吧,哎,那再总结一下,前面呢是拉取map task数据这个过程拉。是靠的,那拉完之后对一些对拉取过来的数据进行一个排序。那么就是这个排序阶段,那后面呢啊,Reduce处理数据以及输出到文件,这个过程就是reduce阶段。哎,比较清楚,那行,那下面呢,这里面有详细的这个文字描述啊,我就不带家给大家去说了哈,那再往下看radio task,一个并行度决定机制。啥意思呢?回忆一下map task的并行度由谁决定?Map test是不是切片呢?按切片的个数就决定了我未来开启多少个map test。那再思考问题。那欺骗个数由谁决定?
02:00
那谁影响你这个切片呢?那记得那个公式吗?呃,公式呢,是这个,呃,Max啊,然后一,然后mini mini呢是一个叫浪的最大值,还有块大小。对吧,那块大小,那mini呢取块大小,块大小呢,又大于你这个一,那这里面取max。哎,结果呢,是按照默认是按照块大小进行切片,这是一条规则,那同时那这个如果你输入的文件内容对吧,输入的内容比较大,那你就可以控制这个这个公式,进而控制切片的大小啊,也会影响你切片的个数,那同时呢一个呢,还有这个切片规则。因为file input里面啊,有这个,呃,Test file input,还有combine text input,呃,Combine是按文件去读啊,那test呢,是按这个行去读,那读的方式不一样,那最终也会影响你切片的一个个数。那下面我们来看下一个,那reduce task的并行度由谁决定?对吧,那我设置多少个task。
03:02
思考一下。首先呢,我们来看,如果我想设置这个radio test,那很容易啊,我直接用这个方式一设置就行了,那我设置多少个呢?你说那越多越好啊。对吧,那我问你1KB的文件。你咔家设置了100个卖task task,你觉得效率会高吗?那光开启这个radio test的时间都比你处理这个数据的时间长。对吧,哎,得不偿失。啊,也就说像这个宋老师准备工作啊,比他真正干活的时间多长。那不浪费时间吗?对吧?哎,呃,那往下看,那到底设置多少合适呢。一般情况下,在企业里面需要你做实验进行测试,那你说通过这个经验去打磨什么经验,假如说啊,你看这里面有一台节点,一个master,还有16个STEM啊,什么意思啊,16台贝诺节点。那CPU呢是8G啊,内存呢是2G啊,每台服务器2G哈,一台服务器一共2G,有点太少了啊,每台2G,其实深圳在生产环境下一般都是128G这种内存。
04:03
只不过呢,他应该是啊,测试的时候呢,服务器比较少这么去测的那行,那他一共开启了16个map task啊ma test。对吧,Map这个map个数啊,设置为16。然后reduce task呢,它设置多少呢?哎,比如说设置一的时候,它执行的时间这么长,设置五个reduce task的时候,执行时间这么长,十个这个15,这个16~16的时候,它执行时间最短。这20它反而就增加了。对吧,哎,那相当于这是一个正态分布曲线。到达中间这位置达到了它的巅峰,效率最佳,那怎么看这个总时间呢?还记得咱们运行这个任务的时候,有一个8088这个端口吗?那里面是不是运行着application,它的开始这个任务开始的时间和结束时间呢?哎,是能够查看这个执行时间的啊。在这个页面上。OK,那以后你们在生产环境下也是,那这个呢,是逐渐的往上增,哎增加到一定程度之后,你会发现它往下降了,对吧,那这个那就OK,然后再增加时间呢,哎,我再增加这个re test呢,发现这个运行时间反而长了。
05:10
那你就要停止了,哎,达到最佳状态。因为它跟你的服务器环境以及网络的这个状态啊,还有呢,就是你这个任务数据量大小都有关系啊,影响的因素比较多哈。好,那下面呢,看一下这个reduce task的一个注意事项,第一条说reduce text等于零,表示呢,没有reduce觉得输出文件个数和map个数呢是一致的。啥意思,你说你把它设零,咱之前设置过一次吧,哎,设置零那压根就没有理六阶段。哎,直接从这个麦孔往出输出就行了。再来reduce,默认值是一,所以输出文件个数为一个,哎,这是咱们看过吧,哎,默认是一个。好,那再来,如果数据分布不均匀,有可能导致宇宙端数据倾斜,数据倾斜啊是非常这个。
06:00
呃,在企业里面吧,啊,发生问题的概率是最高的一个,那比如说哈,什么叫数据信息。还记得咱们那个手机号吗?136137138139。还有个其他。哎,这么五个文件,那你这五个文件。有可能136的手机号,假如说1亿条。一个手机号1371个1381个1391个其他的一个,我说的是一种极端假设,那会导致什么情况?你136的处理时间会非常非常长,其他任务瞬间结束了。对吧,你这个比如说你像像我干活比较持久,那宋老师呢,那。两秒钟完事。那我这边累的不行,他这边闲的要命对吧?嗯,那这个就叫数据倾斜。那后面呢,我们有详细的这个解决办法对吧?哎,大家思考一下怎么解决。怎么解决?那谁干的活多,那就把它分开呗,对不对,你是136,那我能不能给你这里的数据打散呢?对吧,我在你136加上一些随机数。
07:06
对吧?哎,我让它形成多个reduce,那不就可以了吗。行啊,后面会有详细说。那再来说reduce test的数量啊,并不是任意设置,还要考虑业务的逻辑需求,有些情况需要计算全局数据,那就只能一个reduce test。啥意思?我想对所有的数据进行一个全局的大排序,你告诉我,你能给它分成多个文件吗?说我区内有序,那有意义吗?我要的是全局排序,那没办法,那你就只能设置一个。好,再来说啊,具体多少个radio需要根据集群性能而定。这个地方一定要注意。即使你两台电脑的配置一模一样。我能告诉你,它的计算性能也不一样。对吧,你这个你这个本是苹果本,另一个本是华硕。你觉得他俩这个配置是一样的,那运行出来的效果是一样的吗?
08:00
不一样,所以说这个呢,是必须得经过哎生产环境的一个测试,对吧,哎让它达到一个正态分布最佳的一个状态,然后进行。对吧,嗯,好。再来,如果分区数不是一,但是呢,Reduce是一。那会出现什么情况?是否会执行分区?这前给大家演示过,哎,它不会执行分区过程,因为map task源码中执行分区的前提是先判断你reduce个数是否等于一。对吧,如果大于一,那我再进行跟你这个匹配,如果不大一,他会走那个get part那个方法吗?还记得不,根本就不会,对不对,他用了一个匿名内部类啊,匿名内部类,然后在内部类里面。处理了一下,直接是那个partan减一,然后等于零,这个所有数据都会写到零里面啊,这个呢,呃,一个呃,小细节啊,大家要注意行,那这个呢,就是整个啊,Reduce task工作机制,以及它并行度决定机制相关的一些内容。
我来说两句