Saltar al contenido

Cómo leer Spark un archivo grande (petabyte) cuando el archivo no cabe en la memoria principal de Spark

Solución:

En primer lugar, Spark solo comienza a leer los datos cuando una acción (como count, collect o write) se llama. Una vez que se llama a una acción, Spark carga datos en particiones – el número de particiones cargadas simultáneamente depende del número de núcleos que tenga disponibles. Entonces, en Spark puedes pensar en 1 partición = 1 núcleo = 1 tarea. Tenga en cuenta que todas las particiones cargadas simultáneamente deben caber en la memoria, o obtendrá un OOM.

Suponiendo que tiene varias etapas, Spark luego ejecuta las transformaciones desde la primera etapa solo en las particiones cargadas. Una vez que ha aplicado las transformaciones a los datos en las particiones cargadas, almacena la salida como shuffle-data y luego lee en más particiones. Luego aplica las transformaciones en estas particiones, almacena la salida como datos aleatorios, lee en más particiones y así sucesivamente hasta que se hayan leído todos los datos.

Si no aplica ninguna transformación pero solo hace, por ejemplo, una count, Spark aún leerá los datos en las particiones, pero no almacenará ningún dato en su clúster y si lo hace count de nuevo leerá todos los datos una vez más. Para evitar leer datos varias veces, puede llamar cache o persist en cuyo caso Spark voluntad intente almacenar los datos en su clúster. Sobre cache (que es lo mismo que persist(StorageLevel.MEMORY_ONLY) almacenará todas las particiones en la memoria; si no cabe en la memoria, obtendrá un OOM. Si llamas persist(StorageLevel.MEMORY_AND_DISK) almacenará tanto como pueda en la memoria y el resto se guardará en el disco. Si los datos no caben en el disco, el sistema operativo normalmente matará a sus trabajadores.

Tenga en cuenta que Spark tiene su propio pequeño sistema de gestión de memoria. Parte de la memoria que asigna a su trabajo de Spark se usa para almacenar los datos en los que se está trabajando y parte de la memoria se usa para almacenamiento si llama cache o persist.

Espero que esta explicación ayude 🙂

Esto se cita directamente de Apache Spark FAQ (FAQ | Apache Spark)

¿Mis datos deben caber en la memoria para usar Spark?

No. Los operadores de Spark derraman datos en el disco si no caben en la memoria, lo que les permite funcionar bien con datos de cualquier tamaño. Del mismo modo, los conjuntos de datos almacenados en caché que no caben en la memoria se transfieren al disco o se vuelven a calcular sobre la marcha cuando es necesario, según lo determinado por el nivel de almacenamiento del RDD.

En Apache Spark, si los datos no caben en la memoria, Spark simplemente conserva esos datos en el disco.

El método de persistencia en Apache Spark proporciona seis niveles de almacenamiento persistente para conservar los datos.

MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER 
(Java and Scala), MEMORY_AND_DISK_SER 
(Java and Scala), DISK_ONLY, MEMORY_ONLY_2, MEMORY_AND_DISK_2, OFF_HEAP.

El almacenamiento OFF_HEAP está en experimentación.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *