java高级交流群:37341439 欢迎所有学习hadoop2.2.0的朋友加入讨论交流,分享实战经验!我们群无下限哦~~
mapreduce on yarn (MRv2)
mapreduce on yarn 与MRv1在编程模型和数据处理引擎方面的实现是一样的,唯一的区别是运行时环境,mapreduce on yarn的运行时环境由 yarn 和applicationmaster构成。
编程模型:mapreduce的一些api
数据处理引擎:
说明:从MapReduce 自身的命名特点可以看出, MapReduce 由两个阶段组成:Map 和
Reduce。用户只需编写map() 和 reduce() 两个函数,即可完成简单的分布式程序的设计。
map() 函数以key/value 对作为输入,产生另外一系列 key/value 对作为中间输出写入本地
磁盘。 MapReduce 框架会自动将这些中间数据按照 key 值进行聚集,且key 值相同(用户可
设定聚集策略,默认情况下是对 key 值进行哈希取模)的数据被统一交给 reduce() 函数处理。
reduce() 函数以key 及对应的value 列表作为输入,经合并 key 相同的value 值后,产
生另外一系列 key/value 对作为最终输出写入HDFS
hello world --WordCount
Map部分如下:
// key: 字符串偏移量
// value: 一行字符串内容
map(String key, String value) :
// 将字符串分割成单词
words = SplitIntoTokens(value);
for each word w in words:
EmitIntermediate(w, "1");
Reduce 部分如下:
// key: 一个单词
// values: 该单词出现的次数列表
reduce(String key, Iterator values):
int result = 0;
for each v in values:
result += StringToInt(v);
Emit(key, IntToString(result));
用户编写完MapReduce 程序后,按照一定的规则指定程序的输入和输出目录,并提交
到Hadoop 集群中。作业在Hadoop 中的执行过程如图所示。Hadoop 将输入数据切分 成若干个输入分片(input split,后面简称split),并将每个split 交给一个Map Task 处理; Map Task 不断地从对应的split 中解析出一个个key/value,并调用map() 函数处理,处理完 之后根据Reduce Task 个数将结果分成若干个分片(partition)写到本地磁盘;同时,每个 Reduce Task 从每个Map Task 上读取属于自己的那个partition,然后使用基于排序的方法将 key 相同的数据聚集在一起,调用reduce() 函数处理,并将结果输出到文件中 map task (taskAttempt)
Map Task 执行过程如图2-7 所示。由该图可知,Map Task 先将对应的split 迭代解析成一
个个key/value 对,依次调用用户自定义的map() 函数进行处理,最终将临时结果存放到本地 磁盘上,其中临时数据被分成若干个partition,每个partition 将被一个Reduce Task 处理。 reduce task(taskAttempt)
Reduce Task 执行过程如图2-8 所示。该过程分为三个阶段①从远程节点上读取 Map
Task 中间结果(称为“Shuffle 阶段 ”);②按照key 对 key/value 对进行排序(称为“Sort 阶
段”);③依次读取 <key,
value list>,调用用户自定义的reduce() 函数处理,并将最终结果
存到HDFS 上(称为 “Reduce 阶段” )。
运行时环境:
yarn和MRAppMaster
说明:MRAppMaster是mapreduce的applicationMaster的实现,它使得MapReduce应用程序可以直接运行于yarn上,在yarn中,MRAppMaster负责管理MapReduce作业的生命周期,包括作业管理,资源申请与再分配,container启动与释放,作业恢复等。
MRAppMaster工作流程:
按照作业大小不同,提供了3种作业运行模式
map task 生命周期:scheduled-assigned-completed
reduce task 生命周期:pending-scheduled-assigned-completed
由于reduce task的执行需要依赖于map task的输出结果,因此,为避免reduce task过早启动造成资源利用率底下,MRAppMaster让刚启动的reduce处于pending状态,以便能够根据map task的运行情况决定是否对其进行调度。
在yarn之上运行mapreduce作业需要解决2个关键问题:
原帖地址:http://blog.csdn.NET/jiushuai/article/details/17733581 |
|