2016-04-17 6 views
10

Non capisco il parametro spark.task.cpus. Mi sembra che un "compito" corrisponda a un "filo" o un "processo", se lo si vuole, all'interno dell'esecutore. Supponiamo che mi ero prefissato "spark.task.cpus" per 2.Numero di CPU per attività in Scintilla

  1. Come può un filo utilizzare contemporaneamente due CPU? Non potrebbe richiedere blocchi e causare problemi di sincronizzazione?

  2. Sto osservando la funzione launchTask() in deploy/executor/Executor.scala e non vedo alcuna nozione di "numero di cpu per attività" qui. Quindi, dove/in che modo Spark alla fine assegna più di una CPU a un'attività in modalità standalone?

risposta

10

Al meglio della mia conoscenza spark.task.cpus controlla il parallelismo dei compiti in voi cluster nel caso in cui sono noti alcuni compiti particolari di avere la propria parallelismo (personalizzato) interna.

Più in dettaglio: Noi sappiamo che spark.cores.max definisce il numero di thread (aka core) le vostre esigenze applicative. Se si lascia spark.task.cpus = 1 allora si avrà # spark.cores.max numero di attività Spark simultanee in esecuzione nello stesso momento.

Sarà solo voler cambiare spark.task.cpus se si sa che le attività sono essi stessi parallelizzato (forse ciascuno di vostro compito genera due thread, interagisce con strumenti esterni, ecc) Impostando spark.task.cpus di conseguenza, è diventato un buon "cittadino" . Ora se hai spark.cores.max = 10 e spark.task.cpus = 2 Spark creerà solo 10/2 = 5 attività simultanee. Dato che le tue attività richiedono (diciamo) 2 thread internamente, il numero totale di thread in esecuzione non sarà mai superiore a 10. Ciò significa che non andrai mai oltre il tuo contratto iniziale (definito da spark.cores.max).

+4

Vorrei aggiungere che è utilizzato in tutto il sorgente come 'CPUS_PER_TASK' anche se non è realmente applicato in fase di esecuzione (più utilizzo di risorse di una limitazione difficile) – zero323

+0

avete qualche esempio che mostra come un'attività può essere internamente parallelizzata ? @ zero323, CPUS_PER_TASK viene utilizzato in una pianificazione di livello molto elevato, non viene mai passato all'esecutore. Quindi, la mia domanda è "come possiamo assicurarci che un'attività ottenga i core spark.task.cpus che ha richiesto?" – smz

+1

Il modo più semplice (non molto utile): 'rdd.mapPartitions (_. ToVector.par.map (foo))'. E per rispondere alla tua seconda domanda - semplicemente non lo facciamo. Dice solo che se si dichiarano quattro core executor e 'spark.task.cpus' è uguale a 2 allora può iniziare solo 2 attività. Ma c'è l'allocazione dei nuclei fisici o cose simili. 'core' in Spark è solo una discussione. – zero323