この質問は、ワーカーがjarを使用できるようにクラスター全体にjarを配布することについては言及していません。
これは、クライアントマシン上にいくつかの追加ライブラリを指定することを指します。具体的には、SequenceFileの内容を取得するために、次のコマンドを実行しようとしています。
/path/to/hadoop/script fs -text /path/in/HDFS/to/my/file
このエラーがスローされます:text: Java.io.IOException: WritableName can't load class: util.io.DoubleArrayWritable
DoubleArrayWritableという書き込み可能なクラスがあります。実際、別のコンピューターではすべてがうまく機能します。
そのクラスを含むjarを含めるようにHADOOP_CLASSPATH
を設定しようとしましたが、結果がありませんでした。実際、実行中:
/path/to/hadoop/script classpath
結果には、HADOOP_CLASSPATHに追加したjarが含まれていません。
問題は、hadoopを実行するときに追加のライブラリをどのように指定するかです(hadoopスクリプトがクラスパスに自動的に含めるライブラリ以外のライブラリを意味します)
役立つかもしれないいくつかのより多くの情報:
export HADOOP_CLASSPATH=$HADOOP_HOME/lib
これは、HADOOP_CLASSPATH envvarが無視される理由をおそらく説明しています。HADOOP_CLASSPATH
の設定が許可されている場合
export HADOOP_CLASSPATH=/path/to/jar/myjar.jar:$HADOOP_CLASSPATH; \
hadoop fs -text /path/in/HDFS/to/my/file
仕事をします。あなたの場合、この変数はhadoop-env.sh
でoverriddenであるため、代わりに-libjars
オプションの使用を検討してください。
hadoop fs -libjars /path/to/jar/myjar.jar -text /path/in/HDFS/to/my/file
または、FsShell
を手動で呼び出します。
Java -cp $HADOOP_HOME/lib/*:/path/to/jar/myjar.jar:$CLASSPATH \
org.Apache.hadoop.fs.FsShell -conf $HADOOP_HOME/conf/core-site.xml \
-text /path/in/HDFS/to/my/file
誰かがhadoopクラスパスを確認したい場合は、ターミナルに_hadoop classpath
_と入力します。
コンパイルするには、次を使用します:javac -cp $(hadoop classpath):path/to/jars/* Java_file.Java
JarファイルをデフォルトのCLASSPATH変数に追加し、HADOOP_CLASSPATHも追加してみてください。次に、コマンドを実行します。
export CLASSPATH=/your/jar/file/myjar.jar:$CLASSPATH:$HADOOP_CLASSPATH /path/to/hadoop/script fs -text /path/in/HDFS/to/my/file