Hadoop 1.2.1 MapReduce

MapReduce接口

让我们先来看Mapper和Reducer接口。

Hadoop应用程序通常都需要实现Mapper和Reducer接口来提供map和reduce方法。

然后再来讨论其他核心接口,如

JobConf, JobClient, Partitioner, OutputCollector, Reporter,InputFormat, OutputFormat, OutputCommitter 等等。

最后我们会讨论hadoop框架一些有用的功能,如DistributedCache,IsolationRunner 等。

 

Mapper接口

Mapper主要负责数据分发,它会将输入的key/value对映射输出为中间值key/value对。

Map是负责转换输入数据为中间数据的独立任务。中间数据和输入数据的类型不要求相同。一条输入数据可能映射到0或多条中间输出数据。 HadoopMapReduce 框架为InputFormat生成的每个InputSplit生成一个map任务。Mapper实现类通过 JobConfigurabele.configure(JobConf) 方法设置JobConf参数传输给job,以此来初始化自身。然后框架调用map(WritableComparable,Writable, OutputCollector, Reporter)处理InputSplit中读取的每对key/value.应用程序可以覆盖实现Closeable.close()函数来做结束清理工作。

 

Mapper的输出数据通过调用 OutputCollector.collect(WritableComparable,Writable)来收集。

Reporter 可以用来报告工作进度,应用程序状态,更新计数器Counters或者仅仅用来指示节点还是alive的。

Mapper输出的中间数据,同一个key对应的值会被分到同一组传递给Reducer作为一条输入处理从而产生最终输出数据。用户可以通过JobConf.setOutputKeyComparatorClass(Class).指定分组对应的key类。

Mapper输出数据将被排序然后分发给各个Reducer.分区Partition的总数等于reducer任务的个数。用户可以通过自己实现Partitioner接口来控制哪些key(对应的就是哪些数据)被分到哪个reducer.

用户也可以选择通过JobConf.setCombinerClass(Class)指定combiner类来实现中间结果本地的聚合,从而减少mapper到reducer传输的数据量。为Mapper

提供Combiner,在Mapper输出它的<k,v>时,键值对不会被马上写到输出里,他们会被收集在list里(一个key值一个list),当写入一定数量的键值对时,这部分缓冲会被Combiner中进行合并,然后再输出到Partitioner中.

 

排序后的中间结果存储格式是(key-len,key, value-len, value)格式。应用程序可以通过JobConf设置来控制是否需要压缩,以及以何种方式压缩(CompressionCodec)。

 

Map的个数

Map的个数通常是由输入文件的大小决定的,就是输入文件的块数。比较合理的map并行数大约是每个节点10-100个。虽然有时候cpu占用不大的map并行数可以达到300.任务启动也需要花点时间,所以最好map运行至少一分钟才比较划算。这样,如果有10TB输入数据,块大小为128M, 你就会有82000个map.

除非你通过调用setNumMapTasks(int)(这个值也只是作为给框架的建议)设置更大的值。

      

Reducer

Reducer负责数据的规约,将同一个key对应的一组值规约为更少的值。reducer的个数可以通过JobConf.setNumReduceTasks(int).来设置。

Reducer实现类通过调用JobConfigurable.configure(JobConf)方法来传递参数JobConf,以此来初始化自身,然后框架调用 reduce(WritableComparable,Iterator, OutputCollector, Reporter)方法处理 <key, (list of values)>对。通过覆盖实现Closeable.close()可以做必要的结束清理工作。Reducer主要有三个阶段:shuffle, sort, reduce.

l       Shuffle

Reducer的输入是Mapper已经排好序的输出。Reducer通过http获取所有mapper分派给它的数据。

l       Sort

不同的mapper可能输出相同key值的数据对,框架负责将同一个key对应的值分到同一组。

Shuffle和sort阶段同时进行。读入map的输出后他们就会被合并到一起。

The shuffle and sort phases occursimultaneously; while map-outputs are being fetched they are merged.

l       Secondary Sort

如果对中间结果分组的关键字与最终reduction的分组关键字不同,通过JobConf.setOutputValueGroupingComparator(Class)设置关键字比较器,来控制中间结果如何分组。结合这种设置系统可以作二次排序。

l       Reduce

调用reduce(WritableComparable,Iterator, OutputCollector, Reporter) 方法处理分组的输入。Reduce的输出通常通过OutputCollector.collect(WritableComparable,Writable)写到文件系统。.

应用程序可以通过Reporter 来报告进度,应用状态,更新计数器,或指示节点仍然活跃。Reducer的输出结果是无序的。

 

Reduce的个数

Reduce的个数比较合适的设置是c * <no. of nodes>*mapred.tasktracker.reduce.tasks.maximum,0.95 < c <1.75.

C系数为0.95时,所有的reducer能马上启动,map一结束就开始传输map输出的中间结果。

为1.75时,比较快的节点将结束他们的第一轮reduce工作,开始第二波reduce工作。这样做能更好地进行负载均衡。

但是reduce数据的增加会导致系统开销的增加,但是可以更好地进行负载均衡,并且可以降低失效成本。

实际执行指定task的reduce比上面计算出来的总数略少,因为系统将保留几个reduce来做些诊断性任务或者失败需要重新执行的任务。

 Reducer NONE

设置Reduce的数目为0是合法的。有些情况就是不需要reduce做规约。

这种情况下Map的输出直接存到文件系统。地址由 setOutputPath(Path)设置, 此时输出的结果系统不会进行排序。

Partitioner

Partitioner 负责根据关键字来打散Map输出的中间结果,分发到reducer。常见的做法就是哈希函数。Partitioner的个数和reduce任务的个数一样。

HashPartitioner是系统默认采用的Partitioner.

Reporter

Mapper 和 Reducer 的实现中可以看到有个Reporter,  Reporter 负责报告程序执行进度,状态信息,以及计数器得更新。或者仅仅用来显示mapper或reducer是活跃着的。

有时候mapper或reducer任务需要很长时间,这时系统可能认为这个任务超时挂起了把这个任务杀掉。用这个reporter可以报告此时任务任然是活跃的进行中的。

另一种解决方案是在配置中设置 mapred.task.timeout为一个足够大的值。或者设为0, 永不超时。

OutputCollector

OutputCollector 用来收集mapper输出的中间结果,或reducer输出的最终结构。

 

Hadoop MapReduce库包括了一些通用的mapper, reducer,partitioner的实现。

比如TokenCounterMapper是按空格分隔单词并计数为1. InverseMapper将输入<key, value> pair输出为<value, key>,  MultithreadedMapper

多线程执行器。结合java线程池多线程执行map任务。多线程共享同一个mapper实例。所以必须保证线程安全。 

IntSumReducer对同一个key对应的整型值求和。

LongSumReducer对同一个key对应的长整型值求和。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值