须要多少个Map?html
Map的数目一般是由输入数据的大小决定的,通常就是全部输入文件的总块(block)数。node
Map正常的并行规模大体是每一个节点(node)大约10到100个map,对于CPU 消耗较小的map任务能够设到300个左右。因为每一个任务初始化须要必定的时间,所以,比较合理的状况是map执行的时间至少超过1分钟。apache
这样,若是你输入10TB的数据,每一个块(block)的大小是128MB,你将须要大约82,000个map来完成任务,除非使用 setNumMapTasks(int)(注意:这里仅仅是对框架进行了一个提示(hint),实际决定因素见这里)将这个数值设置得更高。api
Reducer的个数取决于用户设置,用户经过JobConf.setNumReduceTasks(int)来设置。app
总的来讲,Reducer的实现须要经过重写JobConfigurable.configure(JobConf)方法,这个方法须要传递一个JobConf参数,目的是完成Reducer的初始化工做。而后,框架为成组的输入数据中的每一个<key, (list of values)>对调用一次 reduce(WritableComparable, Iterator, OutputCollector, Reporter)方法。以后,应用程序能够经过重写Closeable.close()来执行相应的清理工做。框架
Reducer有3个主要阶段:shuffle、sort和reduce。oop
Shufflehtm
reducer的输入对应的是mapper的已排序的输出。排序
Sorthadoop
框架在此阶段根据输入key的值对reducer的输入进行分组(由于不一样mapper的输出中可能会有相同的key);
Shuffle和sort两个阶段是同时进行的;map的输出也是边取回边合并的。
Secondary Sort
若是须要中间过程对key的分组规则和reduce前对key的分组规则不一样,那么能够经过 JobConf.setOutputValueGroupingComparator(Class)来指定一个Comparator。再加上 JobConf.setOutputKeyComparatorClass(Class)可用于控制中间过程的key如何被分组,因此结合二者能够实现按值的二次排序。
Reduce
本阶段框架为已分组的输入数据中的每一个 <key, (list of values)>对调用一次 reduce(WritableComparable, Iterator, OutputCollector, Reporter)方法。
reduce任务的输出一般是经过调用OutputCollector.collect(WritableComparable, Writable)来写入文件系统的。
应用能够利用Reporter来报告进度,设置程序级别状态消息和更新计数器,或是仅仅告知程序运行正常。
Reducer的输出没有排序处理。
须要多少Reduce
Reduce的数目建议是0.95或1.75乘以 (<no. of nodes> *mapred.tasktracker.reduce.tasks.maximum)。