2012-05-07 16 views
12

Ich weiß, wir können die Eigenschaft "mapred.job.reuse.jvm.num.tasks" setzen, um JVM wiederzuverwenden. Meine Fragen sind:JVM wiederverwenden in Hadoop mapreduce jobs

(1) wie die Anzahl der Aufgaben, die hier eingestellt werden, -1 oder einige andere positive ganze Zahlen zu entscheiden?

(2) Ist es eine gute Idee, JVMs bereits wiederzuverwenden und diese Eigenschaft in mapreduce-Jobs auf den Wert -1 zu setzen?

Vielen Dank!

Antwort

19

Wenn Sie sehr kleine Aufgaben haben, die definitiv nacheinander ausgeführt werden, ist es nützlich, diese Eigenschaft auf -1 zu setzen (was bedeutet, dass eine erzeugte JVM unbegrenzt wiederverwendet wird). So spawnen Sie nur (Anzahl der Aufgaben in Ihrem Cluster für Ihren Job verfügbar) -JVMs statt (Anzahl der Aufgaben) -JVMs.

Dies ist eine enorme Leistungsverbesserung. In lang laufenden Jobs ist der Prozentsatz der Laufzeit im Vergleich zur Einrichtung einer neuen JVM sehr niedrig, so dass Sie keinen großen Leistungsschub erhalten.

Auch in lang laufenden Aufgaben ist es gut, den Task-Prozess neu zu erstellen, da Probleme wie die Heap-Fragmentierung die Leistung beeinträchtigen.

Außerdem, wenn Sie einige mitten in der Zeit laufende Jobs haben, könnten Sie nur 2-3 der Aufgaben wiederverwenden, mit einem guten Kompromiss.

+0

Wenn Sie Uber Tasking aktivieren, können Mapper und reduziert die gemeinsame JVM teilen? Oder ist es so, dass Mapper dieselbe JVM teilen können und Reducer dieselbe JVM teilen können? – MikA

1

JVM Wiederverwendung (nur möglich in MR1) sollte mit der Leistung helfen, weil es die Anlaufverzögerung der JVM entfernt, aber es ist nur marginal und hat eine Reihe von Nachteilen (Nebenwirkungen lesen. Die meisten Aufgaben werden für eine lange Zeit ausgeführt (Zehner von Sekunden oder sogar Minuten) und Startzeiten stellen nicht das Problem dar, wenn Sie sich diese Aufgabenlaufzeiten ansehen.Sie möchten eine neue Aufgabe auf einem leeren Blatt starten.Wenn Sie eine JVM erneut verwenden, besteht die Möglichkeit, dass die Heap ist nicht vollständig sauber (es ist fragmentiert von den vorherigen Läufen). Die Fragmentierung kann zu mehr GCs führen und alle Startzeiten-Gewinne zunichte machen. Wenn es ein Speicherleck gibt, könnte dies auch die Speicherbelegung beeinflussen usw. Also ist es besser Starten Sie eine neue JVM für die Tasks (wenn die Tasks nicht relativ klein sind.) In MR2 (YARN) - wird für die Tasks immer eine neue JVM gestartet, für Uber-Tasks nur in der lokalen JVM,

Verwandte Themen