本文档为用户提供将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构建的应用程序无需重新编译即可直接在YARN上运行,只需通过配置将它们指向Apache Hadoop 2.x集群即可。
我们无法确保与使用mapreduce API的应用程序保持完全的二进制兼容性,因为这些API自MRv1以来已经发生了很大变化。不过,我们确保对破坏二进制兼容性的mapreduce API保持源代码兼容性。换句话说,用户应该针对MRv2的jar包重新编译他们使用mapreduce API的应用程序。一个显著的二进制不兼容变化是Counter和CounterGroup。
在MRv2中已移除MRAdmin,因为mradmin
命令不再存在。这些命令已被rmadmin
中的命令取代。对于直接使用此类的应用程序,我们既不支持二进制兼容性,也不支持源代码兼容性。
遗憾的是,为MRv1应用程序保持二进制兼容性可能会导致早期MRv2采用者(特别是Hadoop 0.23用户)出现二进制不兼容问题。对于mapred API,我们选择与用户基数更大的MRv1应用程序保持兼容。而对于mapreduce API,只要不会严重破坏Hadoop 0.23应用程序,我们仍会修改它们以兼容MRv1应用程序。以下是与Hadoop 0.23不兼容的MapReduce API列表。
问题函数 | 兼容性问题 |
---|---|
org.apache.hadoop.util.ProgramDriver#drive |
Return type changes from void to int |
org.apache.hadoop.mapred.jobcontrol.Job#getMapredJobID |
Return type changes from String to JobID |
org.apache.hadoop.mapred.TaskReport#getTaskId |
Return type changes from String to TaskID |
org.apache.hadoop.mapred.ClusterStatus#UNINITIALIZED_MEMORY_VALUE |
Data type changes from long to int |
org.apache.hadoop.mapreduce.filecache.DistributedCache#getArchiveTimestamps |
Return type changes from long[] to String[] |
org.apache.hadoop.mapreduce.filecache.DistributedCache#getFileTimestamps |
Return type changes from long[] to String[] |
org.apache.hadoop.mapreduce.Job#failTask |
Return type changes from void to boolean |
org.apache.hadoop.mapreduce.Job#killTask |
Return type changes from void to boolean |
org.apache.hadoop.mapreduce.Job#getTaskCompletionEvents |
Return type changes from o.a.h.mapred.TaskCompletionEvent[] to o.a.h.mapreduce.TaskCompletionEvent[] |
对于准备在YARN上尝试hadoop-examples-1.x.x.jar
的用户,请注意hadoop -jar hadoop-examples-1.x.x.jar
命令仍会使用与其他MRv2 jar包一起安装的hadoop-mapreduce-examples-2.x.x.jar
。默认情况下,Hadoop框架的jar包在类路径中会优先于用户jar包加载,因此系统仍会选用2.x.x版本jar包中的类。用户应当从集群所有节点的类路径中移除hadoop-mapreduce-examples-2.x.x.jar
。否则,用户需要设置HADOOP_USER_CLASSPATH_FIRST=true
和HADOOP_CLASSPATH=...:hadoop-examples-1.x.x.jar
来运行目标示例jar包,并在mapred-site.xml
中添加以下配置,使YARN容器中的进程也能加载该jar包。
<property> <name>mapreduce.job.user.classpath.first</name> <value>true</value> </property>