2016-06-24 27 views
9

Ho un'applicazione spark python che viene uccisa dal filo per il superamento dei limiti di memoria. Ho un passaggio che comporta il caricamento di alcune risorse un po 'pesanti (500+ MB), quindi sto usando mapPartitions. In sostanza:Utilizzo memoria Python Spark/Yarn

def process_and_output(partition): 
    resources = load_resources() 
    for record in partition: 
     yield transform_record(resources, record) 

input = sc.textFile(input_location) 
processed = input.mapPartitions(process_and_output) 
processed.saveAsTextFile(output_location) 

Durante l'esecuzione, ho sempre ottengo questo errore:

ERRORE YarnScheduler: Perso esecutore 1 su (indirizzo rimosso): Contenitore ucciso da filato per il superamento dei limiti di memoria. 11,4 GB di memoria fisica da 11,2 GB utilizzati. Prendi in considerazione il potenziamento di spark.yarn.executor.memoryOverhead.

Ho tentato di aumentare la memoria di memoria molto in alto, ma ancora lo stesso problema. Ho eseguito con:

--conf "spark.python.worker.memory=1200m" \ 
--conf "spark.yarn.executor.memoryOverhead=5300" \ 
--conf "spark.executor.memory=6g" \ 

Sicuramente, è sufficiente memoria Overhead?

Immagino più generalmente, sto faticando a capire come viene controllata/contata la memoria del pitone worker nel totale complessivo. C'è qualche documentazione di questo?

Vorrei anche capire se l'utilizzo di una funzione di generatore riduce effettivamente l'utilizzo della memoria. Trasmetterà i dati attraverso il processo Python (come spero) o lo bufferizzerà tutto prima di inviare nuovamente all'infrastruttura JVM/spark?

risposta

3

Come vedi 11,2 GB è la tua memoria massima per un contenitore creato da filato. È uguale alla memoria dell'esecutore + sovraccarico. Quindi la memoria di Python non è contata per quello.

L'eccezione vuole aumentare il sovraccarico, ma è sufficiente aumentare la memoria dell'esecutore senza aumentare il ricordo. Questo è tutto quello che posso dire senza sapere perché hai bisogno di tanta memoria in un singolo esecutore, può essere un cartesiano o qualcosa del genere può richiedere così tanta memoria.

5

Filati uccide esecutori quando il suo

memory usage > (executor-memory + executor.memoryOverhead)

Dalla tua impostazione sembra che è un'eccezione valida.

(memory usage)11.4GB > 11.18GB (executor-memory=6GB + memoryOverhead=5.18GB)

provare con

--conf "spark.yarn.executor.memoryOverhead=6144"

+0

Amore questa spiegazione. Grazie per averlo mantenuto reale. – deepelement

+0

Mi ha aiutato! grazie – g07kore