reduce的数目究竟和哪些因素有关

1、我们知道map的数量和文件数、文件大小、块大小、以及split大小有关,而reduce的数量跟哪些因素有关呢?

设置mapred.tasktracker.reduce.tasks.maximum的大小能够决定单个tasktracker一次性启动reduce的数目,可是不能决定总的reduce数目。

conf.setNumReduceTasks(4);JobConf对象的这种方法能够用来设定总的reduce的数目,看下Job Counters的统计:

 Job Counters Data-local map tasks=2Total time spent by all maps waiting after reserving slots (ms)=0Total time spent by all reduces waiting after reserving slots (ms)=0SLOTS_MILLIS_MAPS=10695SLOTS_MILLIS_REDUCES=29502Launched map tasks=2Launched reduce tasks=4

确实启动了4个reduce:看下输出:

diegoball@diegoball:~/IdeaProjects/test/build/classes$ hadoop fs -ls  /user/diegoball/join_ou1123
11/03/25 15:28:45 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
11/03/25 15:28:45 WARN conf.Configuration: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
Found 5 items
-rw-r--r--   1 diegoball supergroup          0 2011-03-25 15:28 /user/diegoball/join_ou1123/_SUCCESS
-rw-r--r--   1 diegoball supergroup        124 2011-03-25 15:27 /user/diegoball/join_ou1123/part-00000
-rw-r--r--   1 diegoball supergroup          0 2011-03-25 15:27 /user/diegoball/join_ou1123/part-00001
-rw-r--r--   1 diegoball supergroup        214 2011-03-25 15:28 /user/diegoball/join_ou1123/part-00002
-rw-r--r--   1 diegoball supergroup          0 2011-03-25 15:28 /user/diegoball/join_ou1123/part-00003

仅仅有2个reduce在干活。为什么呢?

shuffle的过程。须要依据key的值决定将这条<K,V> (map的输出),送到哪一个reduce中去。送到哪一个reduce中去靠调用默认的org.apache.hadoop.mapred.lib.HashPartitioner的getPartition()方法来实现。
HashPartitioner类:

package org.apache.hadoop.mapred.lib;import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.mapred.Partitioner;
import org.apache.hadoop.mapred.JobConf;/** Partition keys by their {@link Object#hashCode()}. */
@InterfaceAudience.Public
@InterfaceStability.Stable
public class HashPartitioner<K2, V2> implements Partitioner<K2, V2> {public void configure(JobConf job) {}/** Use {@link Object#hashCode()} to partition. */public int getPartition(K2 key, V2 value,int numReduceTasks) {return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;}
}

numReduceTasks的值在JobConf中能够设置。

默认的是1:显然太小。

这也是为什么默认的设置中总启动一个reduce的原因。

返回与运算的结果和numReduceTasks求余。

Mapreduce依据这个返回结果决定将这条<K,V>,送到哪一个reduce中去。

key传入的是LongWritable类型,看下这个LongWritable类的hashcode()方法:

 public int hashCode() {return (int)value;}

简简单单的返回了原值的整型值。

由于getPartition(K2 key, V2 value,int numReduceTask)返回的结果仅仅有2个不同的值,所以终于仅仅有2个reduce在干活。

HashPartitioner是默认的partition类。我们也能够自己定义partition类 :

 package com.alipay.dw.test;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Partitioner;/*** Created by IntelliJ IDEA.* User: diegoball* Date: 11-3-10* Time: 下午5:26* To change this template use File | Settings | File Templates.*/
public class MyPartitioner implements Partitioner<IntWritable, IntWritable> {public int getPartition(IntWritable key, IntWritable value, int numPartitions) {/* Pretty ugly hard coded partitioning function. Don't do that in practice, it is just for the sake of understanding. */int nbOccurences = key.get();if (nbOccurences > 20051210)return 0;elsereturn 1;}public void configure(JobConf arg0) {}
}

只须要覆盖getPartition()方法就OK。

通过:
conf.setPartitionerClass(MyPartitioner.class);
能够设置自己定义的partition类。
相同因为之返回2个不同的值0,1,无论conf.setNumReduceTasks(4);设置多少个reduce,也相同仅仅会有2个reduce在干活。

因为每一个reduce的输出key都是经过排序的,上述自己定义的Partitioner还能够达到排序结果集的目的:

11/03/25 15:24:49 WARN conf.Configuration: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
Found 5 items
-rw-r--r--   1 diegoball supergroup          0 2011-03-25 15:23 /user/diegoball/opt.del/_SUCCESS
-rw-r--r--   1 diegoball supergroup      24546 2011-03-25 15:23 /user/diegoball/opt.del/part-00000
-rw-r--r--   1 diegoball supergroup      10241 2011-03-25 15:23 /user/diegoball/opt.del/part-00001
-rw-r--r--   1 diegoball supergroup          0 2011-03-25 15:23 /user/diegoball/opt.del/part-00002
-rw-r--r--   1 diegoball supergroup          0 2011-03-25 15:23 /user/diegoball/opt.del/part-00003

part-00000和part-00001是这2个reduce的输出,因为使用了自己定义的MyPartitioner,全部key小于20051210的的<K,V>都会放到第一个reduce中处理。key大于20051210就会被放到第二个reduce中处理。

每一个reduce的输出key又是经过key排序的,所以终于的结果集降序排列。

可是假设使用上面自己定义的partition类,又conf.setNumReduceTasks(1)的话。会如何? 看下Job Counters:

    Job Counters Data-local map tasks=2Total time spent by all maps waiting after reserving slots (ms)=0Total time spent by all reduces waiting after reserving slots (ms)=0SLOTS_MILLIS_MAPS=16395SLOTS_MILLIS_REDUCES=3512Launched map tasks=2Launched reduce tasks=1

仅仅启动了一个reduce。
  (1)、 当setNumReduceTasks( int a) a=1(即默认值),无论Partitioner返回不同值的个数b为多少,仅仅启动1个reduce,这样的情况下自己定义的Partitioner类没有起到不论什么作用。

(2)、 若a!=1:
   a、当setNumReduceTasks( int a)里 a设置小于Partitioner返回不同值的个数b的话:

    public int getPartition(IntWritable key, IntWritable value, int numPartitions) {/* Pretty ugly hard coded partitioning function. Don't do that in practice, it is just for the sake of understanding. */int nbOccurences = key.get();if (nbOccurences < 20051210)return 0;if (nbOccurences >= 20051210 && nbOccurences < 20061210)return 1;if (nbOccurences >= 20061210 && nbOccurences < 20081210)return 2;elsereturn 3;}

同一时候设置setNumReduceTasks( 2)。

于是抛出异常:

  11/03/25 17:03:41 INFO mapreduce.Job: Task Id : attempt_201103241018_0023_m_000000_1, Status : FAILED
java.io.IOException: Illegal partition for 20110116 (3)at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:900)at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:508)at com.alipay.dw.test.KpiMapper.map(Unknown Source)at com.alipay.dw.test.KpiMapper.map(Unknown Source)at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:397)at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330)at org.apache.hadoop.mapred.Child$4.run(Child.java:217)at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.Subject.doAs(Subject.java:396)at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:742)at org.apache.hadoop.mapred.Child.main(Child.java:211)

某些key没有找到所相应的reduce去处。

原因是仅仅启动了a个reduce。
 
   b、当setNumReduceTasks( int a)里 a设置大于Partitioner返回不同值的个数b的话,相同会启动a个reduce。可是仅仅有b个redurce上会得到数据。启动的其它的a-b个reduce浪费了。

c、理想状况是a=b,这样能够合理利用资源,负载更均衡。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5144262.html,如需转载请自行联系原作者

reduce个数究竟和哪些因素有关相关推荐

  1. 关于hive中的reduce个数的设置。

    我们都知道在进行hive的查询的时候,设置合理的reduce个数能够使计算的速度加快. 具体的提高速度的方法有下面这些: (1)   hive.exec.reducers.bytes.per.redu ...

  2. Hive mapreduce的map与reduce个数由什么决定?

    文章目录 1.MapTask的数量决定 2.如何来调整MapTask的数量 2.1 增加map的数量 : 调小maxsize (要小于blockSize才有效,比如100byte) 2.2 减少map ...

  3. 幸福究竟和哪些因素有关?通过JMP来看全球幸福指数

    "如果有一个从0分到10分的阶梯,顶层的10分代表你可能得到的最幸福的生活,底层的0分代表你可能得到的最差的生活. 你觉得自己现在在哪一层呢?" 你可能要问:什么是最幸福的生活? ...

  4. 大数据之-Hadoop3.x_MapReduce_分区数与reduce个数总结---大数据之hadoop3.x工作笔记0113

    1.然后我们再来看,上一节我们执行的时候设置的job.setNumReduceTasks(5),我们分成了5个分区,那么如果我们设置成4,可以看到上面 会怎么样?  2.设置以后执行可以看到,报错了对 ...

  5. 彻底明白Hadoop map和reduce的个数决定因素

    Hadoop map和reduce的个数设置,困扰了很多学习Hadoop的成员,为什么设置了配置参数就是不生效那?Hadoop Map和Reduce个数,到底跟什么有关系.首先他的参数很多,而且可能随 ...

  6. Hive 设置map 和 reduce 的个数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.  主要的决定因素有: input的文件总个数,input的文件大小,集群设置 ...

  7. hive优化之------控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的 ...

  8. 实战应对三种因素引起的交换故障

    局域网中的计算机往往都是连接到交换机设备上,并通过该设备进行相互交换.处理数据的,可以这样说,交换机工作状态的好坏会对局域网网络的整体运行性能产生直接的影响. 一般来说,新投入使用的交换机设备工作性能 ...

  9. Hive 中的Mapper Reducer个数 决定因素

    1.Mapper个数 Hive 中的Mapper个数的是由以下几个参数确定的: mapred.min.split.size,mapred.max.split.size,dfs.block.size s ...

最新文章

  1. 虚拟化-第二篇-DC,vCenter,ESXI的安装和配置
  2. 计算机动画课程设计,计算机动画课程设计.doc
  3. 求某类型变量的大小(是否使用sizeof)
  4. webgl内置函数--通用函数
  5. eclise配置tomcat出现服务Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4 and Java EE 5 Web modules...
  6. toString、equals方法进阶
  7. Spring为啥默认把bean设计成单例的
  8. 菌群多样性检测_多样性丰富了中学Linux用户群
  9. web安全day27:linux下调整文件及目录权限
  10. 01分数规划解析(转载)
  11. 内存颗粒位宽和容量_内存颗粒的位数是指什么?
  12. git_ Git 工具 - 储藏(Stashing)
  13. DateTime类型的12小时制与24小时制
  14. IIS 服务器常见漏洞
  15. 算法课堂笔记01-语句频度计算
  16. Django项目后端实现注册功能---短信验证码(容联云)。
  17. AVB音视频传输协议简介
  18. QQ6.3显IP加速清爽版 V14.8.21
  19. Unity3D内DllImport的使用,以及对第三方C/C++/Objective-C编写的类库的广泛支持
  20. 使用高德地图微信小程序SDK开发案例-输入提示(附源码)

热门文章

  1. hdu2000——ASCII码排序
  2. Three20 NetWork
  3. 仅让演讲者看到备注信息
  4. VMware Cloud Director 严重漏洞可使整个云基础设施遭接管
  5. 三年蜜罐实验:黑客想从物联网设备中得到什么?
  6. 分析数十年的ICS利用,确定漏洞修复优先级
  7. 详细分析已遭利用的 Desktop Window Manager 0day
  8. 用于安全连接 Microsoft 365 的 Mimecast 数字证书被盗
  9. 实力吊打国家黑客:从密码喷洒到完全控制网络只需几天
  10. 蚂蚁金服开源服务注册中心 SOFARegistry