本文档为用户提供了将其Apache Hadoop MapReduce应用程序从Apache Hadoop 1.x迁移到Apache Hadoop 2.x的信息。
在Apache Hadoop 2.x中,我们将资源管理功能分解为Apache Hadoop YARN(一种通用的分布式应用程序管理框架),而Apache Hadoop MapReduce(又名MRv2)仍然是纯分布式计算框架。
通常,先前的MapReduce运行时(也称为MRv1)已被重用,并且尚未对其进行任何重大手术。因此,MRv2能够确保与MRv1应用程序具有令人满意的兼容性。但是,由于进行了一些改进和代码重构,因此一些API向后不兼容。
本页面的其余部分将讨论我们在Apache Hadoop MapReduce 2.x(MRv2)中支持的范围和向后兼容性级别。
首先,我们确保与使用旧的mapred API 的应用程序具有二进制兼容性。这意味着,建成对MRv1应用mapred的API可以直接纱无需重新编译仅仅通过它们指向一个Apache的Hadoop集群2.X通过配置运行。
我们无法确保与使用mapreduce API 的应用程序完全二进制兼容,因为自MRv1以来,这些API已有很大发展。但是,我们确保打破二进制兼容性的mapreduce API的源兼容性。换句话说,用户应针对MRv2 jar 重新编译使用mapreduce API 的应用程序。Counter和CounterGroup是一个值得注意的二进制不兼容中断。
不幸的是,维护MRv1应用程序的二进制兼容性可能会导致MRv2早期采用者,尤其是Hadoop 0.23用户的二进制不兼容问题。对于映射 API,我们选择与具有较大用户群的MRv1应用程序兼容。对于mapreduce API,如果它们不会严重破坏Hadoop 0.23应用程序,我们仍将其更改为与MRv1应用程序兼容。以下是与Hadoop 0.23不兼容的MapReduce API的列表。
有问题的功能 | 不兼容问题 |
---|---|
org.apache.hadoop.util.ProgramDriver#drive | 返回类型从void更改为int |
org.apache.hadoop.mapred.jobcontrol.Job#getMapredJobID | 返回类型从String更改为JobID |
org.apache.hadoop.mapred.TaskReport#getTaskId | 返回类型从String更改为TaskID |
org.apache.hadoop.mapred.ClusterStatus#UNINITIALIZED_MEMORY_VALUE | 数据类型从long更改为int |
org.apache.hadoop.mapreduce.filecache.DistributedCache#getArchiveTimestamps | 返回类型从long []更改为String [] |
org.apache.hadoop.mapreduce.filecache.DistributedCache#getFileTimestamps | 返回类型从long []更改为String [] |
org.apache.hadoop.mapreduce.Job#failTask | 返回类型从void更改为boolean |
org.apache.hadoop.mapreduce.Job#killTask | 返回类型从void更改为boolean |
org.apache.hadoop.mapreduce.Job#getTaskCompletionEvents | 返回类型从oahmapred.TaskCompletionEvent []更改为oahmapreduce.TaskCompletionEvent [] |
对于要在YARN上尝试hadoop-examples-1.xxjar的用户,请注意hadoop -jar hadoop-examples-1.xxjar仍将使用hadoop-mapreduce-examples-2.xxjar,该软件包与其他版本一起安装MRv2罐子。默认情况下,Hadoop框架jar出现在类路径中用户的jar之前,因此仍会选择2.xx jar中的类。用户应从集群中所有节点的类路径中删除hadoop-mapreduce-examples-2.xxjar。否则,用户需要设置HADOOP_USER_CLASSPATH_FIRST = true和HADOOP_CLASSPATH = ...:hadoop-examples-1.xxjar来运行其目标示例jar,并在mapred-site.xml中添加以下配置 使YARN容器中的过程也选择此罐子。
<属性> <name> mapreduce.job.user.classpath.first </ name> <value> true </ value> </ property>