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 に対してビルドされたアプリケーションは、再コンパイルすることなく、構成を介して Apache Hadoop 2.x クラスタを指すだけで、YARN 上で直接実行できることを意味します。

ソース互換性

MRv1 以降、**mapreduce** API は大幅に進化しているため、**mapreduce** API を使用するアプリケーションとの完全なバイナリ互換性を確保することはできません。ただし、バイナリ互換性を損なう **mapreduce** API のソース互換性は確保します。つまり、ユーザーは **mapreduce** API を使用するアプリケーションを MRv2 jar に対して再コンパイルする必要があります。注目すべきバイナリ非互換性の変更点は、Counter と CounterGroup です。

サポートされていない機能

MRv2 では、`mradmin` コマンドは存在せず、`rmadmin` のコマンドに置き換えられたため、MRAdmin は削除されました。このクラスを直接使用するアプリケーションのバイナリ互換性とソース互換性の両方がサポートされていません。

MRv1ユーザーとMRv2早期導入ユーザー間のトレードオフ

残念ながら、MRv1 アプリケーションのバイナリ互換性を維持すると、特に Hadoop 0.23 ユーザーのような MRv2 の早期導入ユーザーにとって、バイナリ互換性の問題が発生する可能性があります。**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#failTask
org.apache.hadoop.mapreduce.Job#killTask 同上

悪意のある利用

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` を設定してターゲットの examples jar を実行し、`mapred-site.xml` に次の構成を追加して、YARN コンテナ内のプロセスもこの jar を選択するようにする必要があります。

    <property>
        <name>mapreduce.job.user.classpath.first</name>
        <value>true</value>
    </property>