1. 基本概念
MRv1是Hadoop 1.X中的MapReduce实现,它由编程模型(新旧编程接口)、运行时环境(由JobTracker和TaskTracker组成)和数据处理引擎(MapTask和ReduceTask)三部分组成。该框架在扩展性、容错性(JobTracker单点)和多框架(仅支持MapReduce一种计算模型)等支持方面支持不足。关于MRv1的内部实现,可阅读我的最新书籍《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》。
MRv2是Hadoop 2.X中的MapReduce实现,它在源码级重用了MRv1的编程模型和数据处理引擎实现,但运行时环境由YARN和ApplicationMaster组成,其中YARN是一个全新的资源管理系统,而正是由于它的通用性,MRv2的核心已经从单一的MapReduce计算框架转移为资源管理系统YARN,即形成了以YARN为核心的统一框架管理体系,ApplicationMaster则负责MapReduce作业的数据切分、任务划分、资源申请和任务调度与容错等工作(可阅读我的最新书籍《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》中的第12章了解ApplicationMaster实现。)。
不管在MRv1还是MRv2中,MapReduce应用程序编程接口(API)是一致的。为了能够让用户应用程序平滑迁移到Hadoop 2.0中,MRv2尽可能得保证编程接口的向后兼容性,但由于MRv2本身进行了改进和优化,它在向后兼容性方面存在少量问题,而这正是本文所要介绍的。
2. 应用程序编程接口兼容性
MRv2编程接口兼容性的讨论相关的Hadoop jira链接是:https://issues.apache.org/jira/browse/MAPREDUCE-5108。
我们都知道,MapReduce应用程序编程接口有两套,分别是旧API(mapred)和新API(mapredue),它们的性能没有差异(因为内核实现相同),不同之处仅在于编程接口的定义,新API自身拥有更好的封装,在兼容性和扩展性方面更优。关于MapReduce新旧API介绍和对比可阅读我的最新书籍《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》中的第3章 “MapReduce编程模型”。
YARN为基于mapreduce的旧api的种种应用提供了二进制的兼容性。但对于在Hadoop1.x中的新api,仅提供了源代码级的兼容性。Rohit解释说:
在Hadoop 2.0中,各个客户端会向运行在YARN上的MapReduce v2框架提交种种MapReduce应用。而在Hadoop 1.0中,各个客户端则向MapReduce v1框架提交MapRecude应用。这两类新旧API都引用开发者可用的MapRecude框架来创建MapReduce应用。
org.apache.hadoop.mapred API是最早的API,最广泛地使用在MapReduce应用的创建中。任何使用mapred API(即旧API)开发的MapReduce v1应用都可以提交至运行在YARN上的MapReduce v2框架,并在该框架中运行。在这种情况下,无须修改该MapReduce应用。
而org.apache.hadoop.mapreduce API则是MapReduce框架的较新的API集。在MapReduce v2和运行于YARN上的MapReduce v2之间,对这些API没有提供二进制的兼容性。现存的基于MapReducev1的应用如果使用了这些新API,则需要使用Hadoop2.x的Hadoop包进行重编译。重编译后,应用就可以提交至运行在YARN上的MapReduce v2框架,并在该框架中运行。
总结起来,采用MRv1旧API编写的应用程序,可直接使用之前的jar包将程序运行在MRv2上;但采用MRv1新API编写的应用程序则不可以,需要使用MRv2编程库重新编译并根据编译错误提示修改不兼容的参数和返回值,MRv2对API的修改主要集中在函数参数和返回值上,具体如下:
疑问by wade:若我们直接在hadoop2.x平台上开发mapreduce程序,我们应该选择使用旧API还是使用新API ???
Apache Hadoop版本分为两代,我们将第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop 2.0。第一代Hadoop包含三个大版本,分别是0.20.x,0.21.x和0.22.x,其中,0.20.x最后演化成1.0.x,变成了稳定版,而0.21.x和0.22.x则添加了NameNode HA等新的重大特性(0.21/0.22是下一代Hadoop中的MapReduce实现,只不过资源管理系统还是用的JobTracker,没有使用YARN,其他的一样,很多点都改变了)。第二代Hadoop包含两个版本,分别是0.23.x(2011年发布)和2.x,(即hadoop2.x是从hadoop0.23.x这个分支直接进化来的)它们完全不同于Hadoop 1.0,是一套全新的架构,均包含HDFS Federation和YARN两个系统,相比于0.23.x,2.x增加了NameNode HA和Wire-compatibility两个重大特性。从hadoop0.23.x起其就已经包括了HDFS Federation 和YARN.
经过研究hadoop0.23.x发现,里面并没有hadoop1.x中的新api。而从0.20.x开始,其包含了新旧两套api。所以MRv2更兼容MRv1的旧api。二者目录结构完全一样哎。
Hadoop个版本进化表:
本文, 转载自董的博客
本文链接址: http://dongxicheng.org/mapreduce-nextgen/mrv1-mrv2-api-compatibility/
另外,还参考了:http://www.infoq.com/cn/news/2013/11/hadoop-yarn-ga