00:00
好,接下来呢,我们讲解一下如何来设置这个reduce的并行度。那么reduce的并行度啊,同样影响整个job的执行效率啊。你想想哈,当你这个任务当中啊,你开了N多个radio task,那么它处理前一集map task传递过来的数据那。强的很多啊,并不是像说比如说你所有的map test都砸到一个radio test里面去,那么它的负载能力肯定比不上你这边放了十个对吧?哎,这是这样的,那么map task的并行度我们之前讲过。它是由什么决定的,哎。是由切片数决定的。那么reduce的数量又由什么决定呢?它是可以直接手动设置啊。你说可以通过在驱动类中加上这一行代码,也是job.set reduce task。就可以了。那么究竟这个reduce task到底设置多少合适呢?哎,网上呢,有一个IBM工程师,他做了一个实验。
01:06
他的实验环境是这样的,哎。一个master节点,16个slave节点,CPU8G,赫兹内存2G啊。测试的数据量呢,是1G的数据。在不考虑分区的情况下,比如说分区呢,跟这个reduce task始终保持一致的情况下。那么他做了这样的实验,Reduce为一的时候,它耗费的总时间是这么长?Radio设置为五的时候,时间变小了啊,变小了啊。那么radio text为十的时候,哎,发现这个总时间更小了。为15的时候再一次的减小,为16的时候达到了最低点啊88,那么来到了20的时候,反而整。增加。啊,也就是说它这个呢,是符合一个正态分布啊。
02:00
一直争啊。争到这个点的时候,也就16个map test的时候,当前这个环境达到了一个最佳的一个状态,因为你看再往后增加这个map test,它反而这个时间在逐渐的增加。那也就是说这个map task到底取决取多少啊,它跟集群的性能环境是有关系的。环境因素决定的,这个呢,需要你在开发中啊,去不断的去试验啊,并不是说这个一成不变的啊,比如说就是设置时刻合适啊,不是这样啊,根据你的机器有关系。那好,那么关于这个radio text的个数啊,这里面有一些注意事项啊,我们来看一看哈。第一个当这个reduce task为零的时候,表示呢,完全就没有reduce阶段,那么输出这个文件个数和map个数是一致的,就说map输出多少,那reduce其实没有吗?啊,所以说就是多少,那后面呢,我们有一个案例就会将这个reduce task干掉。
03:05
好。那接下来第二条reduce task,它的默认值是一,所以说你看到我们最开始写过的看的时候,它最终输出的文件个数啊,啊,就是一个。啊,这个要知道啊,它的默认值是一。到下面,如果数据不均匀,就有可能在reduce阶段产生数据倾斜,你想想哈,这样假如说在radio阶段,你有三个reduce task。那么第一个人就太处理的日式条数,假如说是2亿条。那么下一个啊,REDUCE2,它处理的数据呢?三呢,它处理的数据呢一条。那你想一想,那这个REDUCE1。他肯定是这个压力过大对吧?啊,所有的任务都压在他这儿了。那么也就是说他肯定会最后的完成啊。
04:01
那时他完成的时间是整个mmr完成的时间。那这样肯定是不合理的,那这呢,这种情况下就叫做这个数据倾斜啊。其他人闲的要死啊,那这个呢,R1呢,忙的要命。尽量在企业开发中会避免这种情况的发生,我们后面呢,会有专门的这个优化手段啊。好,那么task的数量并不是任意设置的啊,需要考虑业务逻辑的需求。在有些情况下,需要计算全局汇总这种结果,那就只能有一个reduce task。那比如说我统计这个所有单词的个数,那么这种情况下,那你必须哎要形成一个reduce,把前面所有单词的个数,哎累加到这一个,也就是里面去。那么如果说就是这个一个reduce task完成不了前一集的任务怎么办呢?往往我们是这样的哈,把多个map的结果,哎,先放到几个reduce里面去。
05:03
然后呢,再开启一个job,对这个reduce再进行一个合并。那这样不就压力小了吗?哎,先当先来一个缓冲中间结果,然后再将中间结果再开一个job进行处理哈。可以采用这种方式。那么具体开多少个radio啊,需要根据集群的性能而定。啊,这个是一定要经过测试的啊,是一种经验值哈,好。那么下面有一个注意事项,如果分期数不是一分。区我没有设置为一。但是reduce task唯一。是否执行分区过程呢?答案是不执行分区过程,因为什么呢?在map源码中啊,执行分区的前提是先判断的是reduce个数。是否大于一,不大于一的话是肯定不执行的,这个要注意哈,默认的这个radio test就是一。
06:00
那也就是说,如果你设置分区了之后,这个分区数一定要跟这个reduce text个数相等啊。这就是reduce test。
我来说两句