MRv1的新旧API分别与MRv2的API兼容性分析

来源:互联网 发布:立马理财靠谱吗 知乎 编辑:程序博客网 时间:2024/05/10 05:02

MRv1的新旧API分别与MRv2的API兼容性分析

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 ???  

个人理解by wade:直接在hadoop2.x平台上开发mapreduce程序的话,最好还是使用新API开发,前面说的一大堆只是如果你以前在hadoop1.x平台上开发过项目,基于旧api的项目相对容易转移到YARN上,而基于新API的需要重新编译才行。

在Hadoop 的Yarn平台上使用mapreduce的新api开发mapreduce程序-demo:http://tech.it168.com/a2013/0912/1533/000001533118_3.shtml

分析: Apache版本衍化

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

0 0
原创粉丝点击