web-dev-qa-db-fra.com

Comment définir le nombre d'exécuteurs Spark?

Comment pourrais-je configurer à partir de Java (ou Scala) le nombre d'exécuteurs ayant SparkConfig et SparkContext? Je vois constamment 2 exécuteurs. On dirait spark.default.parallelism ne fonctionne pas et concerne quelque chose de différent.

J'ai juste besoin de définir un nombre d'exécuteurs égal à la taille du cluster, mais il n'y en a toujours que 2. Je connais la taille de mon cluster. Je cours sur YARN si cela importe.

19

OK, j'ai compris. Le nombre d'exécuteurs n'est pas réellement Spark elle-même, mais plutôt le pilote utilisé pour placer le travail sur YARN. Donc, comme j'utilise la classe SparkSubmit comme pilote et elle a --num-executors paramètre qui est exactement ce dont j'ai besoin.

MISE À JOUR:

Pour certains emplois, je ne suis plus l'approche SparkSubmit. Je ne peux pas le faire principalement pour les applications où Spark n'est que l'un des composants d'application (et est même facultatif). Pour ces cas, j'utilise spark-defaults.conf attaché à la configuration du cluster et spark.executor.instances propriété à l'intérieur. Cette approche est beaucoup plus universelle me permettant d'équilibrer correctement les ressources en fonction du cluster (poste de travail développeur, staging, production).

21

Vous pouvez également le faire par programme en définissant les paramètres "spark.executor.instances" et "spark.executor.cores" sur l'objet SparkConf.

Exemple:

SparkConf conf = new SparkConf()
      // 4 workers
      .set("spark.executor.instances", "4")
      // 5 cores on each workers
      .set("spark.executor.cores", "5");

Le deuxième paramètre est uniquement pour YARN et le mode autonome. Il permet à une application d'exécuter plusieurs exécuteurs sur le même travailleur, à condition qu'il y ait suffisamment de cœurs sur ce travailleur.

20
A. One

Dans Spark version 2.0+

utiliser spark variable de session pour définir dynamiquement le nombre d'exécuteurs (à partir du programme)

spark.conf.set ("spark.executor.instances", 4)

spark.conf.set ("spark.executor.cores", 4)

Dans le cas ci-dessus, 16 tâches au maximum seront exécutées à tout moment.

l'autre option est l'allocation dynamique des exécuteurs comme ci-dessous -

spark.conf.set ("spark.dynamicAllocation.enabled", "true")

spark.conf.set ("spark.executor.cores", 4)

spark.conf.set ("spark.dynamicAllocation.minExecutors", "1")

spark.conf.set ("spark.dynamicAllocation.maxExecutors", "5")

Vous pouvez laisser spark décider de l'allocation du nombre d'exécuteurs en fonction des exigences de traitement et de mémoire pour l'exécution du travail.

Je pense que la deuxième option fonctionne mieux que la première option et est largement utilisée.

J'espère que cela vous aidera.

3
Ajay Ahuja