2015-10-18 8 views
5

Ho appena iniziato a studiare Spark. Secondo la mia comprensione, Spark memorizza l'output intermedio nella RAM, quindi è molto veloce rispetto a Hadoop. Correggimi se sbaglioCosa accade quando l'output intermedio non si adatta alla RAM in Spark

La mia domanda è, se il mio output intermedio è 2 GB e la mia RAM libera è 1 GB, allora cosa succede in questo caso? Potrebbe essere una domanda sciocca, ma non ho capito il concetto in-memory di Spark. Qualcuno può spiegarmi il concetto in-memory di Spark?

Grazie

risposta

6

Questa domanda è relativa a RDD persistence in Spark.

È possibile contrassegnare un RDD da mantenere utilizzando i metodi persist() o cache() su di esso. La prima volta che viene calcolata in un'azione, verrà mantenuta in memoria sui nodi. La cache di Spark è a tolleranza d'errore: se una partizione di un RDD viene persa, verrà automaticamente ricalcolata utilizzando le trasformazioni che l'hanno originariamente creata.

A seconda di come si imposta il livello di archiviazione per un RDD, è possibile configurare diversi risultati. Ad esempio, se imposti il ​​livello di archiviazione come MEMORY_ONLY (che è il livello di archiviazione predefinito), l'output memorizzerà il più possibile in memoria e ricalcola il resto del tuo RDD al volo. Puoi mantenere il tuo RDD e applicare il tuo livello di archiviazione come il seguente: rdd.persist(MEMORY_ONLY).

Nel tuo caso di esempio, 1 GB dell'output verrà calcolato e in memoria e l'altro 1 GB verrà calcolato quando necessario per un passaggio successivo. Ci sono altri livelli di storage che possono essere impostati come pure a seconda del caso d'uso:

  1. MEMORY_AND_DISK - calcolare l'intero RDD, ma rovesciare alcuni contenuti su disco quando necessario
  2. MEMORY_ONLY_SER, MEMORY_AND_DISK_SER - come sopra, ma tutti gli elementi sono serializzate
  3. DISK_ONLY - memorizzare tutte le partizioni direttamente su disco
  4. MEMORY_ONLY_2, MEMORY_AND_DISK_2 - come sopra ma partizioni sono replicati due volte per più tolleranza

Anche in questo caso, è necessario esaminare il caso d'uso per capire qual è il miglior livello di archiviazione. In alcuni casi, la ricomposizione di un RDD potrebbe essere effettivamente più veloce del caricamento di tutto il backup dal disco. In altri casi, un serializzatore veloce può ridurre i dati acquisiti dal disco e portare a una rapida risposta con i dati in questione.

+0

ex - Ho 2 TB di dati. Voglio fare il conteggio delle parole su quei dati.Quindi nel conteggio delle parole abbiamo due trasformazioni, giusto. durante la creazione di RDD da una trasformazione a un'altra trasformazione, crea un RD in un altro RDD. secondo RDD memorizza i dati in memoria, quindi se la mia dimensione della RAM non è più adatta allora questa condizione accadrà. potrebbe essere una domanda sbagliata. puoi spiegarmi l'esempio di conteggio delle parole. –

2

Se ho capito bene la tua domanda, posso rispondere con il seguente:

La directory deposito temporaneo intermedio o è specificato dal parametro di configurazione spark.local.dir durante la configurazione del contesto Spark.

La directory deve essere utilizzata per lo spazio "scratch" in Spark, inclusi i file di output della mappa e gli RDD che vengono memorizzati sul disco. [Ref. Spark Configuration.]

Questo dovrebbe trovarsi su un disco locale veloce nel sistema. Può anche essere un elenco separato da virgole di più directory su diversi dischi.

Tuttavia, il problema che si sta affrontando qui è anche chiamato persistenza RDD. Tra le nozioni di base che dovresti già sapere utilizzando la memorizzazione nella cache di Spark, c'è anche il livello di archiviazione di un RDD che consente un diverso livello di archiviazione.

Questo vi allowe, per esempio, al persistono il set di dati sul disco, persistono nella memoria, ma come oggetti serializzati Java (per risparmiare spazio), replicarlo tra i nodi, o riporlo off -heap in Tachyon(Quest'ultima è sperimentale). More information here.

Nota: Questi livelli vengono impostati passando un oggetto StorageLevel (Scala, Java, Python) a persist. Il metodo cache è una scorciatoia per l'utilizzo del livello di archiviazione predefinito, ovvero StorageLevel.MEMORY_ONLY in cui Spark memorizza gli oggetti deserializzati.

Quindi, per rispondere alla tua domanda ora,

se il mio output intermedio è di 2 GB e la mia RAM è di 1 GB, quindi quello che succede in questo caso?

Dico che dipende da come si configura e si ottimizza Spark (app, cluster).

Nota: L'in-memory di Spark è simile a qualsiasi sistema in memoria nel mondo concept-saggio, l'obiettivo principale è quello di evitare IO pesanti e costosi. Il che significa anche, se torno alla tua domanda che se hai deciso di persistere su DISK per dire, perderai le prestazioni. Maggiori informazioni su questo nella documentazione ufficiale a cui si fa riferimento nella risposta.

+0

ex - Ho dati da 2 TB. Voglio fare il conteggio delle parole su quei dati. Quindi nel conteggio delle parole abbiamo due trasformazioni, giusto. durante la creazione di RDD da una trasformazione a un'altra trasformazione, crea un RD in un altro RDD. secondo RDD memorizza i dati in memoria, quindi se la mia dimensione della RAM non è più adatta allora questa condizione accadrà. potrebbe essere una domanda sbagliata. puoi spiegarmi l'esempio di conteggio delle parole. –

+0

Dipende dal livello di archiviazione che hai scelto. Ad esempio, se decidi di utilizzare l'impostazione predefinita. Finirà in OOM. Se hai deciso di serializzare e archiviare i dati serializzati in memoria, genererà anche OOME ma in seguito. E così via, come descritto nella documentazione ufficiale sulla persistenza RDD. Se si sceglie di archiviare, tuttavia, si perderanno le prestazioni, ma si potrebbe finire con un risultato entro la fine. – eliasah

+0

@ zero323 puoi guardare in fretta questo per me per favore! (Se non c'è fastidio ofc). (L'altra risposta è stata anche copiata dalla mia risposta, c'è qualcosa da fare in proposito? So che sei il moderatore pensato ma potresti conoscere meglio di me.) – eliasah

Problemi correlati