Apache Spark

Spark Performace : Cache() & Persist() I

Brayan Buitrago
iWannaBeDataDriven
Published in
3 min readOct 26, 2020

--

¿Cuándo mejorar el performance del uso de memoria?

source

Ya es conocida la eficiencia de Spark para trabajar con procesamientos de datos en computación distribuida, y cómo con el optimizador de consultas Catalyst Spark es aun más eficiente al trabajar con Dataframes. Haciendo un uso correcto de las particiones se puede mejorar aun más el performance de Spark. Sin embargo, hay una técnica más que se puede usar para mejorar el performance del procesamiento. Como sabes, los DAG definen el plan de trabajo en Spark, pero es común que estos DAG tenga bifurcaciones, sentencias Joins o sentencias Group By, entre otras, las cuales afectaran el performance en la medida que mayor sea la data a procesar. Siempre es conveniente analizar las etapas y utilizar técnicas de optimización como una de las formas de mejorar el rendimiento.

Una de las técnicas de optimización que se puede usar son los métodos cache() y persist(). Estos métodos se usan para almacenar un calculo intermedio de un RDD, DataFrame y Dataset para que puedan reutilizarse en acciones posteriores.

Spark no realiza ningún procesamiento hasta que se le indica una acción a realizar. En la imagen anterior se observan dos planes de trabajo, cada uno se ejecuta cuando se indica la acción.

El primer plan de trabajo será el siguiente:

  • Transformación 1, Transformación 2, Transformación 3, Transformación 4 y Acción 1.

El segundo plan de trabajo será el siguiente:

  • Transformación 1, Transformación 2, Transformación 3, Transformación 5 y Acción 2.

Como puedes observar ambos planes de trabajo realizan las transformaciones 1, 2 y 3. Cómo Spark trabaja sobre la memoria RAM, no almacena ningún dato hasta que entrega el resultado. Esto quiere decir que va a realizar el procesamiento de las transformaciones 1, 2 y 3 dos veces. Esto implica mayor tiempo de procesamiento y mayor uso de la memoria. Es una buena idea persistir el resultado de la Transformación 3 para no realizarlo dos veces. Para esto podemos usar el método cache() o el método persist(), y así mejorar el performance.

De esta forma el plan de trabajo 0 se ejecutará una vez, y los planes de trabajo 1 y 2 procesaran el Dataframe persistido.

No es necesario que hayan bifurcaciones del plan de trabajo para usar esta técnica, también se puede usar cuando se identifique un procesamiento muy pesado, tanto que valga la pena separarlo por etapas para persistir el resultado de cada etapa. De esta forma se liberará espacio de la memoria durante el procesamiento.

Cuando se persiste un Dataframe cada nodo almacena sus datos particionados en la memoria y los reutiliza para aplicar otras transformaciones o acciones sobre ese Dataframe. Los datos persistidos de Spark en los nodos son tolerantes a fallas, lo que significa que si se pierde cualquier partición de un Dataframe, se volverá a calcular automáticamente utilizando las transformaciones originales que lo crearon.

Continuar leyendo.

--

--

Brayan Buitrago
iWannaBeDataDriven

I Want To Be Futurist | Data Mining | Big Data Analytics | Spark Framework — About me: co.linkedin.com/in/BrayanBuitragoLatorre