11

Per il mio frammento di codice, come di seguito:Spark Caching: RDD Solo l'8% nella cache

val levelsFile = sc.textFile(levelsFilePath) 
val levelsSplitedFile = levelsFile.map(line => line.split(fileDelimiter, -1)) 
val levelPairRddtemp = levelsSplitedFile 
           .filter(linearr => (linearr(pogIndex).length!=0)) 
           .map(linearr => (linearr(pogIndex).toLong, levelsIndexes.map(x => linearr(x)) 
           .filter(value => (!value.equalsIgnoreCase("") && !value.equalsIgnoreCase(" ") && !value.equalsIgnoreCase("null"))))) 
           .mapValues(value => value.mkString(",")) 
           .partitionBy(new HashPartitioner(24)) 
           .persist(StorageLevel.MEMORY_ONLY_SER) 

levelPairRddtemp.count // just to trigger rdd creation 

Info

  1. La dimensione del file è ~ 4G
  2. Sto usando 2 executors (5G ciascuno) e 12 core.
  3. Spark versione: 1.5.2

Problema

Quando guardo il SparkUI in Storage tab, Quello che vedo è:

enter image description here

Guardando dentro il RDD, sembra che solo 2 su 24 partitions siano memorizzati nella cache.

enter image description here

Ogni spiegazione a questo comportamento, e come risolvere questo problema.

EDIT 1: Ho appena provato con 60 partizioni per HashPartitioner come:

.. 
.partitionBy(new HashPartitioner(60)) 
.. 

Ed lavorato. Ora sto ricevendo l'intero RDD nella cache. Qualche ipotesi su cosa potrebbe essere successo qui? L'asimmetria dei dati può causare questo comportamento?

Modifica-2: registri contenenti BlockManagerInfo quando ho eseguito nuovamente con 24 partitions. Questa volta sono stati memorizzati nella cache 3/24 partitions:

16/03/17 14:15:28 INFO BlockManagerInfo: Added rdd_294_14 in memory on ip-10-1-34-66.ec2.internal:47526 (size: 107.3 MB, free: 2.6 GB) 
16/03/17 14:15:30 INFO BlockManagerInfo: Added rdd_294_17 in memory on ip-10-1-34-65.ec2.internal:57300 (size: 107.3 MB, free: 2.6 GB) 
16/03/17 14:15:30 INFO BlockManagerInfo: Added rdd_294_21 in memory on ip-10-1-34-65.ec2.internal:57300 (size: 107.4 MB, free: 2.5 GB) 
+0

potrebbe essere possibile che tu abbia scattato lo screenshot prima che l'intero lavoro fosse terminato e semplicemente non si è aggiornato? Se hai i file di log puoi cercare le linee contenenti 'BlockManagerMasterActor'? Altrimenti significherebbe un errore ... –

+0

Il mio è un flusso di lavoro con una durata del ciclo di 5 minuti. Ho aspettato per 15 minuti. – Mohitt

+0

Ottengo alcuni registri da 'BlockManagerMaster', ma solo come INFO, nessun errore. Niente da 'BlockManagerMasterActor' – Mohitt

risposta

1

credo che questo accade perché i limiti di memoria sono raggiunti, o anche di più sul punto, le opzioni di memoria che si utilizza non lasciate che il vostro lavoro utilizzano tutte le risorse.

Aumentare la #partizione, significa ridurre la dimensione di ogni attività, che potrebbe spiegare il comportamento.

Problemi correlati