La tua interpretazione è vicina alla realtà ma sembra che tu sia un po 'confuso su alcuni punti.
Vediamo se posso renderlo più chiaro a voi.
Supponiamo di avere l'esempio di conteggio delle parole in Scala.
object WordCount {
def main(args: Array[String]) {
val inputFile = args(0)
val outputFile = args(1)
val conf = new SparkConf().setAppName("wordCount")
val sc = new SparkContext(conf)
val input = sc.textFile(inputFile)
val words = input.flatMap(line => line.split(" "))
val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}
counts.saveAsTextFile(outputFile)
}
}
In ogni lavoro scintilla si dispone di una fase di inizializzazione in cui si crea un oggetto SparkContext fornendo alcune configurazione come la nomeapp e il maestro, poi si legge un fileInput, si elaborano e si salva il risultato della vostra trasformazione su disco. Tutto questo codice è in esecuzione nel Driver tranne per le funzioni anonime che rendono l'elaborazione effettiva (le funzioni passate a .flatMap, .map e reduceByKey) e le funzioni I/O textFile e saveAsTextFile che sono in esecuzione in remoto sul cluster.
Qui il DRIVER è il nome assegnato a quella parte del programma in esecuzione nello stesso nodo in cui si invia il codice con spark-submit (nella foto si chiama Nodo client). È possibile inviare il codice da qualsiasi computer (ClientNode, WorderNode o anche MasterNode) a condizione che si abbia accesso diretto e accesso di rete al proprio cluster YARN. Per semplicità supporrò che il nodo Client sia il tuo laptop e che il cluster Yarn sia fatto di macchine remote.
Per semplicità tratterò da questa immagine Zookeeper poiché viene utilizzata per fornire l'alta disponibilità a HDFS e non è coinvolta nell'esecuzione di un'applicazione spark. Devo menzionare che Yarn Resource Manager e HDFS Namenode sono ruoli in Yarn e HDFS (in realtà sono processi in esecuzione all'interno di una JVM) e potrebbero vivere sullo stesso nodo master o su macchine separate. Anche i gestori del nodo filato e i nodi dati sono solo ruoli, ma in genere vivono sulla stessa macchina per fornire la località dei dati (elaborazione vicina alla posizione in cui i dati sono archiviati).
Quando si invia l'applicazione, contattare innanzitutto il gestore delle risorse che insieme al NameNode tenta di trovare i nodi Worker disponibili su cui eseguire le attività spark. Per sfruttare il principio della localizzazione dei dati, il Resource Manager preferirà i nodi worker che memorizzano sullo stesso computer blocchi HDFS (una qualsiasi delle 3 repliche per ogni blocco) per il file che si deve elaborare. Se non sono disponibili nodi di lavoro con quei blocchi, utilizzerà qualsiasi altro nodo di lavoro.In questo caso, poiché i dati non saranno disponibili localmente, i blocchi HDFS devono essere spostati sulla rete da uno qualsiasi dei nodi Data al gestore nodi che esegue l'attività spark. Questo processo è fatto per ogni blocco che ha creato il tuo file, quindi alcuni blocchi potrebbero essere trovati localmente, alcuni devono essere spostati.
Quando ResourceManager trova un nodo di lavoro disponibile, contatta il NodeManager su quel nodo e chiede di creare un Jarn Container (JVM) in cui eseguire un programma di esecuzione scintilla. In altre modalità cluster (Mesos o Standalone) non avrai un contenitore di filati ma il concetto di spark executor è lo stesso. Uno spark executor è in esecuzione come JVM e può eseguire più attività.
Il driver in esecuzione sul nodo client e le attività in esecuzione su scintilla esecutori continuano a comunicare per poter eseguire il lavoro. Se il driver è in esecuzione sul laptop e il laptop si blocca, perderai la connessione alle attività e il tuo lavoro avrà esito negativo. Questo è il motivo per cui quando la scintilla è in esecuzione in un cluster di filati, è possibile specificare se si desidera eseguire il driver sul laptop "--deploy-mode = client" o sul cluster di filati come un altro contenitore di filati "--deploy-mode = cluster ". Per maggiori dettagli guarda spark-submit
Grazie mille per questa spiegazione dettagliata !! Per quanto riguarda il modo in cui il gestore delle risorse e il nodo dei nomi lavorano insieme per trovare un nodo di lavoro. Quindi in pratica le tre repliche del tuo file sono memorizzate su tre diversi nodi di dati in HDFS. Il gestore delle risorse seleziona il nodo di lavoro che ha il primo blocco HDFS in base alla località dei dati e contatta il NodeManager su quel nodo di lavoro per creare un contenitore di filati (JVM) su dove eseguire un programma di esecuzione scintilla. Se gli altri blocchi non sono disponibili in questo "intervallo", passeranno agli altri nodi worker e trasferiranno gli altri blocchi su – LP496
la rete al nodo dati più vicino che il gestore risorse ha trovato originariamente (con quel programma di esecuzione spark on) corretto ? – LP496
Sì esattamente. Hai ragione – PinoSan