Apache Hadoop MapReduce - 从 Apache Hadoop 1.x 迁移到 Apache Hadoop 2.x

简介

本文档为用户提供了有关如何将他们的 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 集群即可。

源兼容性

由于这些 API 自 MRv1 以来已大大发展,因此我们无法确保与使用 mapreduce API 的应用程序完全二进制兼容。但是,我们确保破坏二进制兼容性的 mapreduce API 的源兼容性。换句话说,用户应针对 MRv2 jar 重新编译其使用 mapreduce API 的应用程序。一个值得注意的二进制不兼容性中断是 Counter 和 CounterGroup。

不受支持

MRAdmin 已在 MRv2 中删除,因为 mradmin 命令不再存在。它们已被 rmadmin 中的命令替换。我们既不支持直接使用此类的应用程序的二进制兼容性,也不支持源兼容性。

MRv1 用户和早期 MRv2 采用者之间的权衡

不幸的是,维护 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 返回类型从 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 返回类型从 o.a.h.mapred.TaskCompletionEvent[] 更改为 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=trueHADOOP_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>