Domanda Cosa farà scintillare se non avrò abbastanza memoria?


Sono nuovo di Spark, e ho trovato che la documentazione dice che Spark caricherà i dati in memoria per rendere più veloci gli algoritmi di iterazione.

Ma cosa succede se ho un file di registro da 10 GB e ho solo 2 GB di memoria? Spark caricherà il file di registro in memoria come sempre?


12
2017-11-30 14:56


origine


risposte:


Penso che questa domanda abbia avuto una buona risposta nel pannello FAQ del sito web Spark (https://spark.apache.org/faq.html):

  • Cosa succede se il mio set di dati non si adatta alla memoria? Spesso ogni partizione di dati è piccola e si adatta alla memoria e queste partizioni vengono elaborate poche alla volta. Per le partizioni molto grandi che non si adattano alla memoria, gli operatori integrati di Spark eseguono operazioni esterne sui set di dati.
  • Cosa succede quando un set di dati memorizzato nella cache non si adatta alla memoria? Spark può riversarlo su disco o ricalcolare le partizioni che non si adattano alla RAM ogni volta che vengono richieste. Per impostazione predefinita, utilizza il ricalcalo, ma è possibile impostare il livello di archiviazione di un set di dati su MEMORY_AND_DISK per evitare ciò.

11
2018-04-08 15:20



La chiave qui è quella Gli RDD sono divisi partizioni (vedi come alla fine di questa risposta), e ogni partizione è un insieme di elementi (possono essere linee di testo o interi per esempio). Le partizioni sono utilizzate per parallelizzare i calcoli in diverse unità computazionali.

Così il la chiave non è se un file è troppo grande ma se è una partizione. In questo caso, nel FAQ: "Gli operatori di Spark riversano i dati sul disco se non si adattano alla memoria, permettendole di funzionare correttamente su qualsiasi dimensione". Il problema con le grandi partizioni che generano OOM è risolto Qui.

Ora, anche se la partizione può entrare nella memoria, tale memoria può essere piena. In questo caso, rimuove un'altra partizione dalla memoria per adattarla alla nuova partizione. L'espulsione può significare:

  1. Eliminazione completa della partizione: in questo caso se la partizione è richiesta di nuovo, allora lo è ricalcolato.
  2. La partizione viene mantenuta nel livello di archiviazione specificato. Ogni RDD può essere "marcato" in modo da essere memorizzato nella cache / persistere usando Questo livelli di archiviazione, vedi Questo su come.

La gestione della memoria è ben spiegata Qui: "Spark memorizza le partizioni nella cache della LRU in memoria Quando la cache raggiunge il limite della dimensione, rimuove la voce (cioè la partizione) da essa. Quando la partizione ha attributo" disco "(cioè il livello di persistenza consente di memorizzare partizione su disco), sarebbe stato scritto sull'HDD e la memoria consumata da esso sarebbe stata liberata, a meno che non lo si richiedesse. Quando richiesto, verrà letto nella memoria e, se non ci sarà abbastanza memoria, alcune altre voci più vecchie del la cache verrebbe sfrattata. Se la tua partizione non ha attributo "disco", lo sfratto significherebbe semplicemente distruggere la voce della cache senza scriverla su HDD ".

Come vengono partizionati i file / dati iniziali dipende dal formato e dal tipo di dati, nonché dalla funzione utilizzata per creare l'RDD, vedi Questo. Per esempio:

  • Se si dispone già di una raccolta (ad esempio un elenco in java), è possibile utilizzare parallelize () e specificare il numero di partizioni. Gli elementi della raccolta saranno raggruppati in partizioni.
  • Se si utilizza un file esterno in HDFS: "Spark crea una partizione per ogni blocco del file (i blocchi sono di 128 MB per impostazione predefinita in HDFS)".
  • Se si legge da un file di testo locale, ogni riga (terminata con una nuova riga "\ n", il carattere finale può essere modificato, vedere Questo) è un elemento e diverse linee formano una partizione.

Infine, ti suggerisco di leggere Questo per maggiori informazioni e anche per decidere come scegliere il numero di partizioni (troppe o troppo poche?).


3
2017-10-21 19:59



Non caricherà il 10G completo, in quanto non hai abbastanza memoria disponibile. Dalla mia esperienza, uno dei tre avverrà a seconda di come si utilizzano i dati:

Se stai cercando di memorizzare nella cache i 10 GB:

  1. Otterrai un OOME
  2. I dati saranno caricati

Se stai solo elaborando i dati:

  1. I dati verranno scambiati / eliminati dalla memoria

Naturalmente, questo è strettamente correlato al tuo codice e alle trasformazioni che stai applicando.


0
2017-12-03 18:20