web-dev-qa-db-fra.com

Apache Spark: la définition d'instances d'exécuteur ne change pas les exécuteurs

J'ai une application Apache Spark exécutée sur un cluster YARN (spark a 3 nœuds sur ce cluster) en mode cluster.

Lorsque l'application est en cours d'exécution, Spark-UI montre que 2 exécuteurs (chacun s'exécutant sur un nœud différent) et le pilote s'exécutent sur le troisième nœud. Je veux que l'application utilise plus d'exécuteurs, j'ai donc essayé d'ajouter l'argument --num-executors à Spark-submit et de le définir sur 6.

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

Cependant, le nombre d'exécuteurs reste 2.

Sur spark UI, je peux voir que le paramètre spark.executor.instances est 6, comme je le souhaitais, et en quelque sorte il n'y a encore que 2 exécuteurs.

J'ai même essayé de régler ce paramètre à partir du code

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

Encore une fois, je peux voir que le paramètre a été défini sur 6, mais il n'y a toujours que 2 exécuteurs.

Est-ce que quelqu'un sait pourquoi je n'ai pas pu augmenter le nombre de mes exécuteurs testamentaires?

yarn.nodemanager.resource.memory-mb contient 12g de yarn-site.xml

15
user4688877

Augmenter yarn.nodemanager.resource.memory-mb dans yarn-site.xml

Avec 12g par nœud, vous ne pouvez lancer que le pilote (3g) et 2 exécuteurs (11g).

Node1 - pilote 3g (+ 7% de surcharge)

Node2 - executor1 11g (+ 7% de frais généraux)

Node3 - executor2 11g (+ 7% de frais généraux)

vous demandez maintenant l'exécuteur 3 de 11g et aucun nœud n'a de mémoire 11g disponible.

pour 7% de frais généraux, reportez-vous à spark.yarn.executor.memoryOverhead et spark.yarn.driver.memoryOverhead dans https://spark.Apache.org/docs/1.2.0/running-on-yarn.html =

15
banjara

Notez que yarn.nodemanager.resource.memory-mb Est total mémoire qu'un = single NodeManager peut allouer à travers all conteneurs sur un nœud.

Dans votre cas, puisque yarn.nodemanager.resource.memory-mb = 12G, Si vous additionnez la mémoire allouée à tous les conteneurs YARN sur un seul nœud, elle ne peut pas dépasser 12G.

Vous avez demandé 11G (-executor-memory 11G) Pour chaque Spark = Conteneur Executor. Bien que 11G soit inférieur à 12G, cela ne fonctionnera toujours pas. Pourquoi?

  • Parce que vous devez prendre en compte spark.yarn.executor.memoryOverhead, Qui est min(executorMemory * 0.10, 384) (par par défaut, sauf si vous le remplacez).

Donc, les mathématiques suivantes doivent être vraies:

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

Voir: https://spark.Apache.org/docs/latest/running-on-yarn.html pour la dernière documentation sur spark.yarn.executor.memoryOverhead

De plus, spark.executor.instances N'est qu'une simple demande . Spark ApplicationMaster pour votre application fera une demande à YARN ResourceManager pour le nombre de conteneurs = spark.executor.instances. La demande sera accordée par ResourceManager sur le nœud NodeManager basé sur:

  • Disponibilité des ressources sur le nœud. La programmation YARN a ses propres nuances - this est une bonne introduction au fonctionnement de YARN FairScheduler.
  • Si le seuil yarn.nodemanager.resource.memory-mb N'a pas été dépassé sur le nœud:
    • (nombre de conteneurs spark exécutés sur le nœud * (spark.executor.memory + spark.yarn.executor.memoryOverhead)) <= yarn.nodemanager.resource.memory-mb *

Si la demande n'est pas accordée, la demande sera mise en file d'attente et accordée lorsque les conditions ci-dessus seront remplies.

10
user3730028

Pour utiliser le cluster spark à sa pleine capacité, vous devez définir des valeurs pour --num-executors, --executor-cores Et --executor-memory Selon votre cluster:

  • L'indicateur de ligne de commande --num-executors Ou la propriété de configuration spark.executor.instances Contrôle le nombre d'exécuteurs demandés;
  • L'indicateur de ligne de commande --executor-cores Ou la propriété de configuration spark.executor.cores Contrôle le nombre de tâches simultanées qu'un exécuteur peut exécuter;
  • L'indicateur de ligne de commande --executor-memory Ou la propriété de configuration spark.executor.memory Contrôle la taille du segment de mémoire.
2
SagarKhandagale

Vous n'avez que 3 nœuds dans le cluster et un sera utilisé comme pilote, il ne vous reste que 2 nœuds, comment pouvez-vous créer 6 exécuteurs?

Je pense que vous avez confondu --num-executors avec --executor-cores.

Pour augmenter la simultanéité, vous avez besoin de plus de cœurs, vous souhaitez utiliser tous les CPU de votre cluster.

1
David S.