1

簡単な Hadoop ジョブを作成しました。ネット上にある多くのチュートリアルとは対照的に、jarファイルを作成せずに実行したいと思います。

Hadoop(2.0.0 + 91)のcloudera CHD4ディストリビューションを実行するubuntuプラットフォームのシェルスクリプトから呼び出しています。

ジョブの jar ファイルを作成できません。他のいくつかのサード パーティ製の jar ファイルと構成ファイルに依存しているためです。これらのファイルは既に私のマシンに一元的にデプロイされており、jar の作成時にはアクセスできません。したがって、これらのカスタム jar ファイルと構成ファイルを含める方法を探しています。

また、-libjars および DistributedCache オプションは map/reduce フェーズにのみ影響するため使用できませんが、ドライバー クラスもこれらの jar および構成ファイルを使用しています。私の仕事では、これらのサードパーティのライブラリと構成ファイルを内部的に使用するいくつかの社内ユーティリティ コードを使用しています。これらのファイルは、中央に展開された場所からのみ読み取ることができます。

これがシェルスクリプトから呼び出す方法です。

sudo -u hdfs hadoop x.y.z.MyJob /input /output

それは私に

Caused by: java.lang.ClassNotFoundException: x.y.z.MyJob
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

シェル スクリプトを呼び出すと、Hadoop クラスパスが正常に設定され、必要なすべてのサード パーティ製ライブラリと構成ファイルが中央に配置された場所から格納されます。

私のクラスxyzMyJobとすべての必要なライブラリと構成ファイルが、hadoop ジョブを呼び出す前に設定している$CLASSPATH$HADOOP_CLASSPATH環境変数の両方にあると確信しています

スクリプトの実行時に、プログラムがクラスを見つけられないのはなぜですか。ジョブを通常の Java クラスとして実行できませんか? 私の他の通常のJavaプログラムはすべて同じクラスパスを使用しており、クラスと構成ファイルをいつでも問題なく見つけることができます。

一元的に展開された haddop ジョブ コードにアクセスして実行する方法を教えてください。

編集:クラスパスを設定するコードは次のとおりです

CLASSES_DIR=$BASE_DIR/classes/current
BIN_DIR=$BASE_DIR/bin/current
LIB_DIR=$BASE_DIR/lib/current
CONFIG_DIR=$BASE_DIR/config/current
DATA_DIR=$BASE_DIR/data/current
CLASSPATH=./
CLASSPATH=$CLASSPATH:$CLASSES_DIR
CLASSPATH=$CLASSPATH:$BIN_DIR
CLASSPATH=$CLASSPATH:$CONFIG_DIR
CLASSPATH=$CLASSPATH:$DATA_DIR
LIBPATH=`$BIN_DIR/lib.sh $LIB_DIR`
CLASSPATH=$CLASSPATH:$LIBPATH
export HADOOP_CLASSPATH=$CLASSPATH

lib.sh は、すべてのサードパーティ ファイルを : 区切り形式に連結するファイルで、CLASSES_DIR には私のジョブ コード xyzMyJob クラスが含まれています。すべての構成ファイルは CONFIG_DIR の下にあります

CLASSPATH と HADOOP_CLASSPATH を印刷すると、正しい値が表示されます。ただし、ジョブを実行する直前に hadoop クラスパスを呼び出すと、次の出力が表示されます。

$ hadoop classpath

/etc/hadoop/conf:/usr/lib/hadoop/lib/*:/usr/lib/hadoop/.//*:myname:/usr/lib/hadoop-hdfs/./:/usr/lib/hadoop-hdfs/lib/*:/usr/lib/hadoop-hdfs/.//*:/usr/lib/hadoop-yarn/lib/*:/usr/lib/hadoop-yarn/.//*:/usr/lib/hadoop-0.20-mapreduce/./:/usr/lib/hadoop-0.20-mapreduce/lib/*:/usr/lib/hadoop-0.20-mapreduce/.//*

$

以前に設定された $CLASSPATH および $HADOOP_CLASSPATH 変数が追加されていないことは明らかです。これらの環境変数はどこにありますか。

4

1 に答える 1

1

シェル スクリプト内で、Cloudera の hdfs ユーザーを使用して hadoop jar コマンドを実行していました。

sudo -u hdfs hadoop jar x.y.z.MyJob /input /output

このコードは、実際には、上記のように CLASSPATH および HADOOP_CLASSPATH 変数を設定していた通常の ubuntu ユーザーを使用してスクリプトから呼び出されていました。また、実行時に、同じ通常の ubuntu ユーザーを使用して hadoop jar コマンドが呼び出されませんでした。したがって、クラスが見つからないことを示す例外が発生しました。

そのため、実際に CLASSPATH および HADOOP_CLASSPATH 環境変数を設定している同じユーザーでジョブを実行する必要があります。

お時間をいただきありがとうございます。

于 2012-08-11T10:24:49.897 に答える