Abstracciones en Spark: RDDs vs Dataframes vs Datasets

Pablo Jiménez García
4 min readJul 10, 2020

--

Para aquellos que se están iniciando en el uso de Spark, puede resultar confuso entender cuál es la relevancia de cada abstracción y decidir cuál es la adecuada para según que usos y cuales no. En esta entrada, se discutirán todas las abstracciones en detalle, con sus diferencias, ventajas y desventajas.

Introducción:

Antes de explicar cada abstracción por separado, se hará una pequeña introducción, con la evolución seguida por Spark:

RDD (Spark1.0) → Dataframe(Spark1.3) → Dataset(Spark1.6)

RDD (Resilient Distributed Dataset) es la abstracción más antigua y se lanzó con la versión 1.0, mientras que Dataset es la abstracción más novedosa, y está disponible desde la versión 1.6. Dado un mismo conjunto de datos, cada una de las 3 abstracciones computa y devuelve el mismo resultado, pero esto se hace con diferencias en el rendimiento y la forma de computación.

RDD permite decidir CÓMO se quiere que Spark procese los datos, lo cual limita la optimización que el framework realiza. Por otra parte, los DataFrame/Datasets permiten decidir QUÉ se quiere hacer, dejando que Spark decida cómo realizar las computaciones pertinentes. Se muestran a continuación cada una de las abstracciones con un mayor nivel de detalles:

RDD:

  • Es la piedra angular de Spark. Sin importar si estamos usando Dataframes o Datasets, internamente, todas las computaciones finales se realizan en RDDs.
  • Los RDD son una colección de objetos de ejecución lazy.
  • Lo mejor de los RDD es su simpleza. Se pueden cargar datos de muy diversas fuentes, convertirlas a RDD y alojarlas en memoria para computar los resultados. Los RDD pueden ser cacheados fácilmente si se necesitan realizar cálculos sobre el mismo set de datos.
  • Su principal desventaja son las limitaciones en el desempeño. Al ser objetos de la JVM en memoria, los RDD toman un mayor tiempo de cálculo debido a la recolección de basura y la serialización de Java (o Kyro), y este tiempo, además, crece al crecer la cantidad de datos.

Dataframe:

  • Los Dataframes son una abstracción que proporciona un schema a los datos. Esto significa que podemos ver los datos como columnas, cada una con su nombre e información acerca del tipo de dato. Puede pensarse que son datos organizados como en una base de datos.
  • Como los RDD, su ejecución es lazy.
  • Una de sus ventajas es que ofrece una mejora en el rendimiento sobre los RDD debido a 2 características propias:
  • Custom Memory management (o Project Tungsten): Los datos se almacenan en una memoria externa en formato binario, lo cual ahorra un montón de espacio y elimina el sobrecoste del recolector de basuras. Al conocer el schema de los datos previamente y almacenarlos eficientemente en formato binario, evitamos una serialización en java que sea demasiado cara.
  • Optimized Execution Plans (aka Catalyst Optimizer): Los planes de consultas son creados usando el el catalyst optimiser de Spark. Tras preparar una ejecución optimizada para que ejecute paso a paso, la ejecución final es realizada en solamente en RDD, de forma oculta para los usuarios.
  • Inconveniente: Falta de seguridad en el tipado. Desarrollar usando dataframes puede parecer menos indicadospara programadores. Referirse a los atributos por nombres en String conlleva no compile time safety. Algunas cosas pueden fallar en el momento de la ejecución. Por otra parte, la API parece más orientada al desarrollo en SQL que a otros tipos de programación.

Dataset:

  • Es una extensión del API de Dataframe, la útlima de las abstracciones que intenta proveer lo mejor de los RDD y los Dataframes.
  • Implementa un estilo de programación orientada a objetos y seguridad en el compilado como los RDD, y las mejoras de rendimiento de los Dataframes.
  • Los Datasets incluyen una nueva características, los Encoders.
  • Los Encoders actuan como una interfaz entre los objetos de la JVM y datos binarios personalizados.
  • Los Encoders generan código byte para interactuar con datos fuera de lo común y proveen acceso bajo demanda a atributos individuales sin tener que des-serializar un objeto entero.

Conclusion:

Es importante recordar que tanto los Datasets como los Dataframe ejecutan todas sus operaciones internas sobre RDDs con la única diferencia de que los usuarios no tienen que crear estos RDDs, sino que se crean en el plan de ejecución en el último paso, tras decidir y pasar todas las optimizaciones.Todas estas optimizaciones son posibles porque los datos están estructurados y Spark conoce su esquema, de forma que puede usar todas sus características (Custom Memory Management y Catalyst optimiser) para conseguir un rendimiento que no sería posible si los usuarios trabajasen directamente con RDDs.

Spark está evolucionando desde la computación desestructurada hacia computación estructurada por las muchas mejoras de rendimiento que esta permite. Los Dataframe fueron un paso en esta dirección, pero no ofrecían facilidades para los desarrolladores en cuanto a tiempos de compilación, posibilidad de usar funciones lambda, etc. Por último, los Datasets, al ser la unificación de los RDD y los Dataframe proporcionan lo mejor de los dos. En el futuro, los desarrolladores deberían preocuparse tan solo de los Datasets, e intentar no usar ninguna de las otras dos abstracciones en la medida de lo posible. Aunque, es beneficioso estar al tanto del código legacy de la aplicación para una mejor comprensión de cómo funciona internamente.

--

--

Pablo Jiménez García

Desarrollador Big Data de profesión. Ingeniero técnico de Obras Públicas y Minas de formación. Adicto a la adrenalina por diversión.