MapReduce简单介绍

本文详细介绍了Hadoop MapReduce的工作原理及其组成部分,包括JobTracker、TaskTracker等核心组件的功能。此外还探讨了如何通过MapReduce处理大数据,包括输入输出数据格式、Mapper与Reducer的设计与实现。
摘要由CSDN通过智能技术生成

前面已经体会到了hadoop的魅力,为了更深入的了解hadoop,不仅仅是为了写出运行hadoop的程序,而是更好的了解她,用她来解决我们需要解决的问题。
MapReduce是hadoop的核心,所以了解MapReduce是运用hadoop的首要任务。下面是翻译过来的MapReduce介绍,作为自己学习的一个借鉴。


Hadoop MapReduce 可以轻松的写应用程序在集群中并行,可靠,容错地处理大数据。一个MapReduce job 通常把输入的数据分切成独立的chunks,

并由map task 完全并行的方式来处理。Map task 处理完成后,将处理完成的结果排序,作为reduce task 的输入数据。整个MapReduce架构会自动的

分配task,监控task和重启失效的task。


MapReduce包含Jobtracker 和 TaskTracker。Jobtracker只有一个,Tasktracker存在于每一个slave节点上。Jobtracker分配任务给Tasktracker,

Tasktracker根据命令执行,监控和重启失败的task。


尽管Hadoop是用java实现的,但是MapReduce程序可以不用java编写。可以使用Hadoop Streaming (SHELL)

和 Pipes(C++)来编写。


Input和Output
Mapreduce 以键值对<key,value>的方式来处理数据。

Key和value类必须要序列化,需实现writable接口。Key类需要实现 writablecomparable接口支持排序。


MapReduce的Input和Output如下:
(input) <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> (output)

用workcount示例:
map-1:
< Hello, 1> 
< World, 1> 
< Bye, 1> 
< World, 1>

map-2:
< Hello, 1> 
< Hadoop, 1> 
< Goodbye, 1> 
< Hadoop, 1>

map-1的输出:
< Bye, 1> 
< Hello, 1> 
< World, 2>
map-2的输出:
< Goodbye, 1> 
< Hadoop, 2> 
< Hello, 1>

Reduce执行结果:
< Bye, 1> 
< Goodbye, 1> 
< Hadoop, 2> 
< Hello, 2> 
< World, 2>

MapReduce 用户接口
MapReduce程序通常需要实现 Mapper 和 Reducer 接口来提供map 和 reduce方法。这是整个工作的核心。

Mapper
Mapper maps 将输入的 key/value 处理成 中间形式的 key/value。中间数据不需要和输入数据一样的类型。Map将输入的数据处理输出零个

或多个 output键值对,output键值对被OutputCollector.collect(WritableComparable,Writable)类收集处理成中间数据 mapper output。

mapper output会被排序和分区交给reduce处理。分区数和reducer task的数量一致。用户可以通过实现自定义 Partitioner来控制哪些

 keys 交给reducer 处理。
用户可以选择指定combiner,通过JobConf.setCombinerClass(Class)指定combiner类。Combiner类可计算本地的中间数据,

来减少Mapper数据转换工作量给Reducer。

Maps的数量通常取决于需要处理数据的分片数多少。每个slave节点通常可同时运行10-100个maps。如果在高性能CPU机器上最多可以

运行300maps。如果处理10TB的内容,blocks 128MB的话,需要82000个maps甚至更多。


Reducer
Reducer 将mapper output中间数据处理成想要的结果。
Reduce的数量可以通过JobConf.setNumReduceTasks(int)设置。
Reduce有三个阶段:shuffle,sort,reduce。

Shuffle
Reduce的输入数据是mapper处理和排过序的。在该阶段中通过HTTP协议来完成mapper相关结果的分区partition。

Sort
该阶段根据key来排序。Shuffle和Sort阶段在map output结果合并后。

Reduce
在reduce阶段,处理被分组后的每个<key,list<values>>键值对。
Reduce的处理结果会通过OutputCollector.collect(WritableComparable, Writable)写入FileSystem。
应用程序可以通过Reporter来报告进度,设置应用程序状态和更新计数器,或监听是否存活。
Reducer的处理结果是没有排序的。

How Many Reduce
Reduce的节点数一般是节点数nodes的0.95 – 1.75倍。0.95倍下maps阶段完成后reduces可以立即执行。在1.75倍下,性能好的

阶段优先完成第一轮reduce,然后开始第二轮reduce来提供更好的负载均衡。

不断增加reduces的数量会使整个架构负载,但是会提高负载均衡和降低失效成本。


Reducer NONE
当我们不需要 reduce-task时,把reduce task的数量设置为0是合法的。

Partioner
Pationer控制map-outputs的关键字分区。通常关键字被hash分区。Pationer的数量通常和reduce task的数量一致,并控制着哪些

key被哪一个reduce处理。Hash 分区是默认的partitioner。

Reporter
Reporter为MapReduce程序提供运行进度,应用等级状态信息和更新计数器。

OutoutCollector
OutputCollector是由MapReduce架构提供来专门收集mapper和reducer的处理结果的工具。
Hadoop MapReduce自带的library有很多有用的mappers,reducers和partitioners。

Job Configuration
JobConf 体现了MapReduce 的配置信息。
JobConf是用户用来描述MapReduce任务,hadoop根据该JobConf来执行任务。MapReduce会公平的根据JobConf的描述来执行任务。

JobConf是用来指定Mapper,combiner(如果需要),Partitioner,Reducer,InputFormat,OutputFormat和OutputCommitter类实现。

另外,JobConf也用来指定高级设置。比如:比较器Comparator,文件保存到分布式缓存DistributedCache,中间结果和处理完成的结果

的压缩,通过用户提供的脚本debug,最大尝试任次数attempts per task,最大容忍失败任务百分比等等。


资料来源:http://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值