私は、hadoopパスの前例としてユーザークラスパスを使用する方法の多くの兆候を見てきました。多くの場合、これは、m/rジョブが、hadoopがすでに古いバージョンのライブラリを使用している特定のバージョンのライブラリを必要とする場合に行われます(たとえば、jacksonのjsonパーサーやcommons httpなど)。
とにかく:私は見た:
mapreduce.task.classpath.user.precedence
mapreduce.task.classpath.first
mapreduce.job.user.classpath.first
これらのパラメーターのどれがrightであり、マッパーとリデューサーにユーザーを配置するクラスパスを強制するためにジョブ構成で設定します。定義済みhadoop_classpath
jars hadoopのデフォルトの依存関係jarの前?
ちなみに、これはこの質問に関連しています: Dynamodb requestHandler accepting 最近見つけたのはjarの競合によるものです。
したがって、0.20.203を使用していると仮定すると、これは TaskRunner.Java コードで次のように処理されます。
mapreduce.user.classpath.first
_getClassPaths(..)
と呼ばれるメソッドに委任するクラスパスのリストを作成するための呼び出しが行われる場所です。getClassPaths()
は524行目で定義されており、構成プロパティを使用して、ジョブ+ distキャッシュライブラリ、またはhadoopライブラリを最初にクラスパスに配置するかどうかを決定できるはずです。他のバージョンのhadoopの場合は、TaskRunner.Javaクラスをチェックして、configプロパティの名前を確認することをお勧めします。これはすべて "semi hidden config":
_static final String MAPREDUCE_USER_CLASSPATH_FIRST =
"mapreduce.user.classpath.first"; //a semi-hidden config
_
最新のHadoopバージョン(2.2以降)と同様に、次のように設定する必要があります。
conf.setBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, true);
これらの設定は、マッパーまたはリデューサータスクでのみ外部jarのクラスを参照するために機能します。ただし、カスタマイズされたInputFormatなどでこれらを使用している場合、クラスのロードに失敗します。これが(MR2の)どこでも機能することを確認する方法は、ジョブを送信するときにこの設定をエクスポートすることです。
export HADOOP_USER_CLASSPATH_FIRST=true
同じ問題が発生し、Hadoopバージョン0.20.2-cdhu03で機能したパラメーターは「mapreduce.task.classpath.user.precedence」です。
この設定はCDH3U3では機能しないことがテストされています。次の回答はClouderaチームからのものです。
// JobConf job = new JobConf(getConf(), MyJob.class);
// job.setUserClassesTakesPrecedence(true);
MapRディストリビューションでは、プロパティは「mapreduce.task.classpath.user.precedence」です。
http://www.mapr.com/doc/display/MapR/mapred-site.xml
<property>
<name>mapreduce.task.classpath.user.precedence</name>
<value>true</value>
<description>Set to true if user wants to set different classpath. (AVRO) </description>
</property>
jobConf.setUserClassesTakesPrecedence(true);