各マッパータスクとリデューサータスクでセットアップメソッドとクリーンアップメソッドがそれぞれ呼び出されていますか?または、全体的なマッパーとリデューサーのジョブの開始時に一度だけ呼び出されますか?
それらはタスクごとに呼び出されるため、20個のマッパーを実行している場合は、それぞれに対してセットアップ/クリーンアップが呼び出されます。
1つの問題は、MapperとReducerの両方の標準のrunメソッドがmap/reduceメソッドの周りの例外をキャッチしないことです。したがって、これらのメソッドで例外がスローされた場合、クリーンアップメソッドは呼び出されません。
1つの説明が役立ちます。 setup/cleanupメソッドは、タスクレベルでの初期化とクリーンアップに使用されます。タスク内では、最初にsetup()メソッドへの1回の呼び出しで初期化が行われ、次にmap()[またはreduce()]関数へのすべての呼び出しが行われます。その後、タスクを終了する前に、cleanup()メソッドをもう一度呼び出します。
MapperタスクまたはReducerタスクごとに呼び出されます。これがhadoopコードです。
public void run(Context context) throws IOException, InterruptedException {
setup(context);
try {
while (context.nextKey()) {
reduce(context.getCurrentKey(), context.getValues(), context);
}
} finally {
cleanup(context);
}
}
mapreduceドキュメント によると、各MapperタスクとReducerタスクに対してセットアップとクリーンアップが呼び出されます。
減速機では、ジョブで実行できますjob.setNumReduceTasks(1);このようにして、レデューサーのセットアップとクリーンアップは1回だけ実行されます。