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
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 =
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?
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:
yarn.nodemanager.resource.memory-mb
N'a pas été dépassé 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.
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:
--num-executors
Ou la propriété de configuration spark.executor.instances
Contrôle le nombre d'exécuteurs demandés;--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;--executor-memory
Ou la propriété de configuration spark.executor.memory
Contrôle la taille du segment de mémoire.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.