Sto cercando di capire la relazione tra il numero di core e il numero di esecutori durante l'esecuzione di un processo Spark su YARN.
L'ambiente di test è il seguente:
- Numero di nodi di dati: 3
- Specifiche della macchina del nodo dati:
- CPU: Core i7-4790 (N. di core: 4, N. di thread: 8)
- RAM: 32 GB (8 GB x 4)
- HDD: 8 TB (2 TB x 4)
Rete: 1Gb
Versione Spark: 1.0.0
Versione Hadoop: 2.4.0 (Hortonworks HDP 2.1)
Flusso di lavoro Spark: sc.textFile -> filtro -> mappa -> filtro -> mapToPair -> reduceByKey -> mappa -> saveAsTextFile
Dati in ingresso
- Tipo: file di testo singolo
- Dimensioni: 165 GB
- Numero di linee: 454.568.833
Produzione
- Numero di righe dopo il secondo filtro: 310.640.717
- Numero di righe del file dei risultati: 99.848.268
- Dimensione del file dei risultati: 41 GB
Il lavoro è stato eseguito con le seguenti configurazioni:
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(esecutori per nodo dati, utilizza tanto quanto i core)--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(Numero di core ridotti)--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(meno core, più esecutore)
Tempi trascorsi:
50 min 15 sec
55 min 48 sec
31 min 23 sec
Con mia sorpresa, (3) è stato molto più veloce.
Ho pensato che (1) sarebbe stato più veloce, dato che ci sarebbero state meno comunicazioni tra gli esecutori quando si mescolavano.
Sebbene il numero di core di (1) sia inferiore a (3), il numero di core non è il fattore chiave poiché 2) ha funzionato bene.
(Seguiti aggiunti dopo la risposta di pwilmot.)
Per informazione, la cattura dello schermo del monitor delle prestazioni è la seguente:
- Riepilogo nodo dati gangliari per (1) - il lavoro è iniziato alle 04:37.
- Riepilogo nodo dati gangliari per (3) - il lavoro è iniziato alle 19:47. Si prega di ignorare il grafico prima di quel momento.
Il grafico si divide approssimativamente in 2 sezioni:
- Primo: dall'inizio alla riduzioneByKey: CPU intensiva, nessuna attività di rete
- Secondo: dopo ridurreByKey: la CPU si abbassa, l'I / O di rete è terminato.
Come mostra il grafico, (1) può utilizzare tutta la potenza della CPU che è stata fornita. Quindi, potrebbe non essere il problema del numero di thread.
Come spiegare questo risultato?