map数和reduce数目

须要多少个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)。

相关文章
相关标签/搜索