Optimización de Spark
¿Qué es la optimización del rendimiento de Spark?
La optimización del rendimiento de Spark consiste en el proceso de ajustar la configuración de la memoria, los núcleos y las instancias que utiliza el sistema. Este proceso garantiza que Spark tenga un rendimiento impecable y también evita los cuellos de botella de recursos en Spark. 
Más temas para descubrir
¿Qué es la serialización de datos?
Para reducir el uso de la memoria, es posible que debas almacenar los RDD de Spark en formato serializado. La serialización de datos también determina un buen rendimiento de la red. Obtendrás buenos resultados en el rendimiento de Spark de la siguiente manera:
- Finalizar los trabajos que se ejecutan por mucho tiempo.
- Garantizar que los trabajos se ejecuten en un motor de ejecución preciso.
- Usar todos los recursos de manera eficiente.
- Mejora del tiempo de rendimiento del sistema.
Spark admite dos bibliotecas de serialización, que son las siguientes:
- Serialización de Java
- Serialización Kryo
¿Qué es la optimización de memoria?
Al optimizar el uso de la memoria, hay tres aspectos que se destacan:
- El dataset completo debe caber en la memoria; es fundamental tener en cuenta la memoria que utilizan sus objetos.
- Al tener una alta rotación de objetos, la sobrecarga de la recolección de basura se vuelve una necesidad.
- Deberás tener en cuenta el costo de acceder a esos objetos.
¿Qué es la optimización de la estructura de datos?
Una opción para reducir el consumo de memoria es evitar las características de Java que podrían generar sobrecarga. A continuación, se indican algunas formas de hacerlo:
- En caso de que el tamaño de la RAM sea inferior a 32 GB, el indicador de la JVM debe establecerse en –xx:+UseCompressedOops. Esta operación creará un puntero de cuatro bytes en lugar de ocho.
- Las estructuras anidadas se pueden evitar usando varios objetos pequeños y punteros.
- En lugar de usar cadenas de texto para las claves, puede usar ID numéricos y objetos enumerados.
¿Qué es la optimización de la recolección de basura?
Para evitar la gran “rotación” relacionada con los RDD que el programa almacenó anteriormente, Java descartará los objetos antiguos para crear espacio para los nuevos. Sin embargo, al usar estructuras de datos con menos objetos, el costo se reduce considerablemente. Un ejemplo de esto sería el uso de un array de Ints en lugar de una lista enlazada. Como alternativa, podrías usar objetos en formato serializado, de manera que solo tendrás un único objeto por cada partición de RDD.
¿Qué es la gestión de memoria?
Un uso eficiente de la memoria es esencial para un buen rendimiento. Spark utiliza la memoria principalmente para el almacenamiento y la ejecución. La memoria de almacenamiento se utiliza para almacenar datos en caché que se reutilizarán más adelante. Por otro lado, la memoria de ejecución se usa para los cómputos en shuffles, sorts, joins y agregaciones. La contención de memoria plantea tres desafíos para Apache Spark:
- ¿Cómo arbitrar la memoria entre la ejecución y el almacenamiento?
- ¿Cómo arbitrar la memoria entre las tareas que se ejecutan simultáneamente?
- ¿Cómo arbitrar la memoria entre los operadores que se ejecutan dentro de la misma tarea?
En lugar de evitar reservar memoria de forma estática por adelantado, podrías lidiar con la contención de memoria cuando surja forzando a los miembros a hacer spill.


