2015-04-29 9 views
9

Mam aplikację Apache Spark działającą w klastrze YARN (iskra ma 3 węzły w tym klastrze) w trybie klastra.Apache Spark: ustawienie instancji executorów nie zmienia executorów

Gdy aplikacja jest uruchomiona, Spark-UI pokazuje, że 2 executory (każdy działający w innym węźle) i sterownik działają na trzecim węźle. chcę aplikacji do korzystania z więcej wykonawców więc próbowałem dodając argument --num-wykonawców do Spark-złożyć i ustawić go do 6.

spark-submit --driver-memory 3G --num-executors 6 --class main.Application --executor-memory 11G --master yarn-cluster myJar.jar <arg1> <arg2> <arg3> ...

Jednak liczba wykonawców pozostaje 2.

W interfejsie iskrowym Widzę, że parametr spark.executor.instances ma wartość 6, tak jak zamierzałem, i jakoś nadal są tylko dwa executory.

Próbowałem nawet ustawienie tego parametru z kodem

sparkConf.set("spark.executor.instances", "6") 

Znowu widzę, że parametr został ustawiony na 6, ale nadal istnieją tylko 2 wykonawców.

Czy ktoś wie, dlaczego nie mogłem zwiększyć liczby moich wykonawców?

yarn.nodemanager.resource.memory MB jest 12g w przędzy site.xml

+0

jaka jest wartość yarn.nodemanager.resource.memory-mb w yarn-site.xml ?? – banjara

+0

Yarn.nodemanager.resource.memory-mb jest 12GiB – user4688877

Odpowiedz

9

Wzrost yarn.nodemanager.resource.memory-mb w yarn-site.xml

Z 12g na węźle można uruchomić tylko sterownik (3G) i 2 wykonawców (11g).

Node1 - 3g kierowca (+ 7% narzut)

Node2 - executor1 11g (+ 7% narzut)

Node3 - executor2 11g (+ 7% narzut)

teraz żądasz dla executor3 z 11g i żaden węzeł nie ma dostępnej 11g pamięci.

do 7% narzutu odnoszą spark.yarn.executor.memoryOverhead i spark.yarn.driver.memoryOverhead w https://spark.apache.org/docs/1.2.0/running-on-yarn.html

+1

Nie mogłem zwiększyć tego parametru, ponieważ nie mam wystarczającej ilości pamięci RAM, ale wypróbowałem ją na innej aplikacji iskrzenia, która nie wymaga dużej ilości pamięci executora i działała, dzięki – user4688877

+0

Przez kilka dni borykałem się z podobnym problemem.Dziękuję za odpowiedź, zadziałało jak urok! – nooblar

1

Masz tylko 3 węzły w klastrze, a jeden będzie używany jako kierowca, masz tylko 2 węzły, jak możesz utworzyć 6 executorów?

Myślę, że pomyliłeś --num-executors z --executor-cores.

Aby zwiększyć współbieżność, potrzebujesz więcej rdzeni, chcesz wykorzystać wszystkie procesory w klastrze.

+0

Czy może być tylko jeden executor na węzeł? – user4688877

+0

Nie, w każdym węźle jest dostępnych 12g pamięci, a jeden executor pobiera 11g, więc nie można uruchomić drugiego executora na tym samym węźle. możesz zwiększyć yarn.nodemanager.resource.memory-mb lub zmniejszyć --executor-memory, aby uruchomić wiele executorów na tym samym węźle – banjara

0

Aby w pełni wykorzystać pojemność iskry, należy ustawić wartości dla --num-executors, --executor-core i --executor-memory zgodnie z klastrem.

Parametry konfiguracji --num-executors flag lub spark.executor.instances kontrolują liczbę żądanych executorów.

Flaga konfiguracji wiersza polecenia --executor-rdzycie lub właściwość konfiguracji spark.executor.cores steruje liczbą równoczesnych zadań, które może wykonać executor.

Flaga wiersza polecenia --executor-memory lub właściwość konfiguracji spark.executor.memory steruje wielkością sterty.

1

Zauważ, że yarn.nodemanager.resource.memory-mb jest całkowity pamięć, że pojedynczy NodeManager może przydzielić całej wszystkie pojemniki na jednym węźle.

W twoim przypadku, od yarn.nodemanager.resource.memory-mb = 12G, jeśli dodasz pamięć przydzieloną do wszystkich kontenerów YARN na dowolnym węźle, nie może przekroczyć 12G.

Zażądano 11G (-executor-memory 11G) dla każdy Wykonawca pojemnika Spark. Choć 11G to mniej niż 12G, to nadal nie zadziała. Czemu ?

  • Ponieważ trzeba uwzględnić spark.yarn.executor.memoryOverhead, który jest min(executorMemory * 0.10, 384) (przez domyślnie, chyba że zastąpi go).

Więc po matematyki musi posiadać prawdziwe:

spark.executor.memory + spark.yarn.executor.memoryOverhead< =yarn.nodemanager.resource.memory-mb

Patrz: https://spark.apache.org/docs/latest/running-on-yarn.html do najnowszej dokumentacji na spark.yarn.executor.memoryOverhead

Ponadto spark.executor.instances jest jedynie żądanie. Aplikacja Spark ApplicationMaster dla twojej aplikacji przekaże żądanie do YARN ResourceManager dla liczby kontenerów = spark.executor.instances. Żądanie zostanie przyznane przez ResourceManager w węźle NodeManager na podstawie:

  • Dostępność zasobów w węźle. Harmonogram YARN ma własne niuanse - this jest dobrym podkładem na temat działania YARN FairScheduler.
  • czy yarn.nodemanager.resource.memory-mb próg nie został przekroczony na węźle:
    • (liczba pojemników zapłonowych uruchomionych na węźle * (spark.executor.memory + spark.yarn.executor.memoryOverhead)) < =yarn.nodemanager.resource.memory-mb *

Jeśli żądanie nie zostanie udzielone, żądanie zostanie umieszczone w kolejce i przyznane, gdy zostaną spełnione określone powyżej warunki.