2016-08-18 3 views
0

Ich versuche also einige Hadoop-Jobs auf AWS R3.4xLarge-Maschinen auszuführen. Sie haben 16 Vcores und 122 Gigabyte RAM zur Verfügung.Hadoop erstellt nicht genügend Container, wenn mehr Knoten verwendet werden

Jeder meiner Mapper benötigt etwa 8 Gigs RAM und einen Thread, also sind diese Maschinen sehr perfekt für den Job.

Ich habe mapreduce.memory.mb bis 8192 gesetzt, und mapreduce.map.java.opts auf -Xmx6144 Dies soll in etwa 14 Mapper (in der Praxis näher an 12) führt, auf jeder Maschine ausgeführt wird.

Dies ist in der Tat der Fall für ein 2-Slave-Setup, wo der Scheduler 90 Prozent Auslastung des Clusters zeigt.

Bei der Skalierung auf beispielsweise 4 Slaves scheint es, dass hadoop einfach nicht mehr Mapper erstellt. In der Tat schafft es weniger.

Auf meinem 2-Slave-Setup hatte ich knapp 30 Mapper gleichzeitig laufen, auf vier Slaves hatte ich etwa 20. Die Maschinen waren bei knapp 50 Prozent Auslastung.

Die Vcores sind da, der physische Speicher ist da. Was zum Teufel fehlt? Warum erstellt Hadoop nicht mehr Container?

Antwort

0

Es stellt sich also heraus, dass dies eines dieser Dinge ist, die keinen Sinn ergeben, egal wie sehr Sie versuchen, es herauszufinden.

Es gibt eine Einstellung im Garn-Standard namens yarn.nodemanager.heartbeat.interval-ms. Dies ist auf 1000 festgelegt. Offensichtlich steuert es die minimale Zeitspanne zwischen dem Zuweisen von Containern in Millisekunden.

Dies bedeutet, dass nur eine neue Kartenaufgabe pro Sekunde erstellt wird. Das bedeutet, dass die Anzahl der Container durch die Anzahl der Container begrenzt ist, die ich habe * die Zeit, die ein Container benötigt, um fertig zu werden.

Indem ich diesen Wert auf 50 oder noch besser auf 1 gesetzt habe, konnte ich die Skalierung erreichen, die von einem Hadoop-Cluster erwartet wird. Ehrlich gesagt sollte besser dokumentiert werden.

Verwandte Themen