FAQもとい「よくあるミス」
Hadoop でよくあるミスを、FAQ 形式で記録しておきます。
なお Hadoop のバージョンは、0.20.2 です。
1.RunJar jarFile [mainClass] args...
hadoop コマンドで jar ファイル指定時に、main メソッドがあるクラス名を指定していないことが原因です。
main メソッドがあるクラス名を、完全修飾名で指定しましょう。
【例】 bin/hadoop jar xxx.jar
2.Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
ToolRunner で Job を実行する場合は、コマンドライン引数として input と output を指定する必要があります。
この場合、input・output のどちらも指定していないことが原因です。
input と output を指定しましょう。
【例】 bin/hadoop jar xxx.jar
3.Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
上記2と同様で、output を指定していないことが原因です。
output を指定しましょう。
4.Output directory file:/xxx already exists
output に指定したディレクトリが既にある場合に出るエラーです。
Hadoop は、結果を誤って上書きしないよう、output に指定されたディレクトリが既に存在する場合はエラーとする仕組みになっています。
output に指定したディレクトリを一旦削除して、Hadoop を再実行すると良いでしょう。
5.java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.LongWritable, recieved org.apache.hadoop.io.Text
JobConf の OutputKeyClass を指定していないことが原因です。
Hadoop のデフォルト設定では、Mapper の処理結果のキーは LongWritable 型です。
今回の例では、Mapper 内で処理結果のキーを Text 型にしようとしたものの、JobConf の OutputKeyClass を指定していないため、型のミスマッチで怒られています。
JobConf#setOutputKeyClass() で、該当するクラスを指定しましょう。
【例】 jobConf.setOutputKeyClass(Text.class);