Piszę harmonogram Hadoop. Moje planowanie wymaga znalezienia czasu procesora zajętego przez każde zadanie Map/Reduce.

Wiem to:

  • Klasa TaskInProgress utrzymuje wartości execStartTime i execFinishTime, które są czasami zegara ściennego, gdy proces został rozpoczęty i zakończony, ale nie wskazują dokładnie czasu procesora zużywanego przez zadanie.

  • Każde zadanie jest wykonywane w nowej JVM i mógłbym użyć OperatingSystemMXBean.getProcessCpuTime (), ale ponownie opis metody mówi mi: „Zwraca czas procesora używany przez proces, w którym wirtualna Java maszyna działa w ciągu nanosekund". Nie wiem do końca, czy tego właśnie chcę.

0
reddragon 20 luty 2012, 21:44

2 odpowiedzi

Najlepsza odpowiedź

Dla potomności rozwiązałem ten problem, wprowadzając zmianę w src/mapred/org/apache/hadoop/mapred/TaskLog.java (Hadoop 0.20.203) w wierszu 572

mergedCmd.append("exec setsid 'time' ");    // add 'time'

Czas procesora zostanie zapisany do: logs/userlogs/JOBID/TASKID/stderr. Napisałem również skrypt, który zbiera skumulowany czas procesora: https://gist.github.com/1984365 Przed uruchomieniem zadania upewnij się, że:

rm -rf logs/userlogs/*

Aby skrypt działał.

0
reddragon 6 marzec 2012, 10:42

Używam biblioteki, która rejestruje metryki zasobów, takie jak użycie procesora/czas bezczynności, użycie wymiany i użycie pamięci.

http://code.google.com/p/hadoop-toolkit/

Musisz wyodrębnić łatkę i zastosować ją do wersji tagu 20.2.

I am not entirely clear if this is what I want.

Jestem prawie pewien, że ta metoda zwraca również czas zegara ściennego.

0
Thomas Jungblut 20 luty 2012, 21:55