各マッパーとリデューサーが費やした時間と、Hadoop のコード内 (Web インターフェイスではなく) のシャッフル (並べ替え) の時間を見つける方法は? すべてのマッパー (またはリデューサー) による合計時間はどうですか?
1 に答える
hereJobTracker
で説明されているように、クラスター自体に関する一連の情報とすべてのジョブの詳細を提供する API があります。
特に、ジョブ ID がわかっている場合に、個々のマップごとにメトリックを検索してタスクを減らしたい場合は、ここで説明するインスタンスgetMapTaskReports
を返す を呼び出して、やなどのメソッドにアクセスできるようにすることができます。たとえば、次のようになります。TaskReport
getFinishTime
getStartTime
TaskReport[] maps = jobtracker.getMapTaskReports("your_job_id");
for (TaskReport rpt : maps) {
long duration = rpt.getFinishTime() - rpt.getStartTime();
System.out.println("Mapper duration: " + duration);
}
TaskReport[] reduces = jobtracker.getReduceTaskReports("your_job_id");
for (TaskReport rpt : reduces) {
long duration = rpt.getFinishTime() - rpt.getStartTime();
System.out.println("Reducer duration: " + duration);
}
ジョブ内のすべてのマッパーまたはレデューサーの合計時間をカウントするには、単純にコード内でそれらを合計することができます。
シャッフルに関しては、これは通常、各削減タスクの 33% としてジョブトラッカーでカウントされます。これは、必ずしも 33% の時間であることを意味するわけではありませんが、タスクごとのシャッフル時間を取得する自動化された方法はないと思います。この単純なヒューリスティックで 33% を達成できます。
ただし、上記のように jobtracker API からの時間測定を使用することにより、レデューサーの時間が少し偏る可能性があることを考慮してください。これは、reduce タスクが開始されると、本質的にシャッフル (説明したように最大 33%) が行われるためです。すべてのマップ タスクが終了するまで待機し、その後で初めて実際の削減を開始するため、削減の測定値は実際にはこれら 3 つの期間 (シャッフル + 待機 + 削減) の合計になります。