sc.defaultParallelism
è solo un suggerimento. A seconda della configurazione, potrebbe non avere una relazione con il numero di nodi. Questo è il numero di partizioni se si utilizza un'operazione che accetta un argomento di conteggio delle partizioni ma non lo si fornisce. Ad esempio sc.parallelize
creerà un nuovo RDD da un elenco. Puoi dire quante partizioni creare nell'RDD con il secondo argomento. Ma il valore predefinito per questo argomento è sc.defaultParallelism
.
È possibile ottenere il numero di esecutori con sc.getExecutorMemoryStatus
nell'API Scala, ma questo non è esposto nell'API Python.
In generale, la raccomandazione è di avere circa 4 volte il numero di partizioni in un RDD di cui si dispone con gli esecutori. Questo è un buon suggerimento, perché se c'è una variazione in quanto tempo impiegano le attività, questo verrà risolto. Alcuni esecutori elaboreranno 5 compiti più veloci, mentre altri elaboreranno 3 attività più lente, per esempio.
Non è necessario essere molto precisi con questo. Se hai una brutta idea, puoi andare con un preventivo. Come se sapessi di avere meno di 200 CPU, puoi dire che 500 partizioni andranno bene.
Quindi cercate di creare RDDs con questo numero di partizioni:
rdd = sc.parallelize(data, 500) # If distributing local data.
rdd = sc.textFile('file.csv', 500) # If loading data from a file.
o la ripartizione del RDD prima del calcolo se non si controlla la creazione del RDD:
rdd = rdd.repartition(500)
Puoi controllare il numero di partizioni in un RDD con rdd.getNumPartitions()
.
fonte
2015-03-01 12:15:25
Grazie. Tuttavia, quando eseguo 'sc.getExecutorMemoryStatus', viene visualizzato un errore che dice che l'oggetto '' SparkContext '' non ha attributo 'getExecutorMemoryStatus''. Stai usando PySpark? – Bryan
No, sto usando l'API Scala. Ho pensato che sarebbe anche parte dell'API Python, ma sembra che non lo sia. Immagino che le tue opzioni siano da aggiungere all'API Python o passare all'API di Scala. Oppure prendi il numero di macchine come argomento da linea di comando. –
Cosa intendi considerando il numero di macchine come argomento della riga di comando? Puoi richiamarlo quando apri la shell interattiva di PySpark? Sono un tipo Python (quindi non Scala) e non voglio iniziare a fare cambiamenti API. – Bryan