The HIRO Says

If you smell what The HIRO is cooking!!!

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

<input>

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);