簡単な 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 変数が追加されていないことは明らかです。これらの環境変数はどこにありますか。