Benchmark de rendimiento entre Parquet, Delta Lake, ORC, AVRO

Rafael VM
6 min readJul 11, 2024

--

Elegir el formato de serialización adecuado puede ser decisivo para optimizar el rendimiento y la eficiencia del programa que estemos desarrollando. Por este motivo, como parte de mi aprendizaje continúo y de la mano de Máster en Data Engineer de la EOI he desarrollado el siguiente Benchmark.

A continuación os proporciono información sobre los formatos Apache Parquet, Delta Lake, y ORC, también AVRO y JSON. He procurado abordar concretamente estos formatos en términos de ratio de compresión, rendimiento en lectura/escritura, y algunas características particulares.

Además he mencionado brevemente como he considerado, en función a las fuentes consultadas en qué etapas de una arquitectura de datos típica es más conveniente usar cada uno de estos formatos.

Y por último, para no quedarme solo en el plano teórico, he montado un pequeño proyecto de benchmarking con JMH, donde autogenero un dataset pequeño y un dataset grande para evaluar el rendimiento de escritura y lectura para cada tipo de formato de archivos. Han sido 2 horas las que ha tardado en ejecutarse por completo y el resultado lo he guardado en un json (falló a la primera) y el output de consola en un fichero .log.

Por falta de mas tiempo, podría haber elaborado un poco mas la generación de datos y haber generado datasets con mas columnas, para así evidenciar de manera mas representativa el rendimiento de los formatos columnares.

Pero bueno, creo que es un buen punto de partida para ir mejorando este benchmark, a la vez de que me ha permitido aportar mis propios datos de rendimiento w/r (asumiendo que algo puede estar mal)

Repo aqui: Repositorio Github DataFormatBenchmark

el json / log adjunto . No conseguí generar un json con los resultados a la primera. Pero el log si. He pegado mas abajo el resultado del benchmark.

Para obtener los resultados en formato Json me faltó añadir una configuración. Que en conjunto debería ser lo siguiente:

addCommandAlias(
"jmh-run-json",
s"""jmh:run -i 10 -wi 10 -f1 -t1 -rf json -rff "benchmarks/results_${Time.current}.json""""
)
# comando para ejecutar el benchmark JMH:
sbt jmh:run -i 1 -wi 1 -f1 -t1 -p dataset=small -rf json -rff src\main\scala\benchmark\results\benchmark_results.json > output.log 2>&1

FORMATOS DE SERIALIZACIÓN

Apache Parquet

Parquet es un formato de almacenamiento en columnas, diseñado para el almacenamiento eficiente de grandes volúmenes de datos. Es ampliamente utilizado en ecosistemas Big Data como Apache Hadoop, Apache Spark, y Apache Drill.

  • Características

Almacenamiento en columnas: Esto permite una compresión más eficiente y una lectura más rápida para ciertos tipos de consultas.

Compatibilidad: Integración nativa con varios sistemas de Big Data.

Compresión: Soporta múltiples algoritmos de compresión, como Gzip, Snappy, y Brotli.

  • Rendimiento

Compresión: Alta tasa de compresión debido a su estructura en columnas.

Lectura/Escritura: Lectura rápida de columnas específicas, aunque la escritura puede ser más lenta comparada con formatos fila-orientados.

Ratio de compresión y descompresión: La compresión en Parquet puede ser intensiva en CPU, especialmente con algoritmos como Gzip. Snappy es más rápido pero ofrece una menor compresión. La tasa de compresión típica varía entre 2:1 y 10:1.

Delta Lake

Delta Lake es una capa de almacenamiento open-source que ofrece transacciones ACID a Apache Spark y grandes lagos de datos.

  • Características

Transacciones ACID: Garantiza la consistencia de los datos en operaciones concurrentes.

Versionado de datos: Permite mantener versiones históricas de los datos.

Integridad: Maneja esquemas de datos evolutivos y evita la corrupción de datos.

  • Rendimiento

Compresión: Comparable a Parquet, ya que Delta Lake se basa en él.

Lectura/Escritura: Beneficiado por las transacciones ACID y el versionado, lo que puede implicar una sobrecarga adicional en ciertas operaciones.

Ratio de compresión y descompresión: Similar a Parquet, con una compresión típica de 2:1 a 10:1. La sobrecarga adicional proviene del manejo de transacciones y versionado.

ORC (Optimized Row Columnar)

ORC es un formato de almacenamiento en columnas optimizado para el uso en Hadoop.

  • Características

Optimización: Diseñado específicamente para optimizar el almacenamiento y acceso en Hadoop.

Compresión avanzada: Utiliza técnicas de compresión como Zlib, lo que permite una mayor compresión.

Índices y estadísticas: ORC almacena estadísticas de columnas que permiten una optimización adicional en las consultas.

  • Rendimiento

Compresión: Alta tasa de compresión debido a su estructura y técnicas avanzadas.

Lectura/Escritura: Muy eficiente en lecturas debido a sus índices y estadísticas. La escritura puede ser más lenta debido a la optimización y compresión.

Ratio de compresión y descompresión: ORC ofrece una mejor compresión en comparación con Parquet, generalmente entre 3:1 y 12:1, con una demanda significativa de CPU para la compresión.

Otros Formatos Relevantes

  • Avro: Ideal para serialización de datos en aplicaciones donde se necesita una compatibilidad de esquemas y soporte para muchos lenguajes de programación.
  • JSON/CSV: Simples y ampliamente soportados, pero no eficientes en términos de compresión y rendimiento en grandes volúmenes de datos.

COMPARATIVA DE FORMATOS

Recomendaciones de Uso en Arquitectura de Datos

Ingestión de Datos (Izquierda)

CSV/JSON: Útil para la ingestión rápida y simple de datos. Son formatos fáciles de manejar y ampliamente soportados.

Avro: Adecuado para aplicaciones que requieren compatibilidad de esquemas y soporte multiplataforma.

Almacenamiento y Procesamiento (Centro)

Parquet: Ideal para almacenamiento eficiente y procesamiento analítico debido a su estructura en columnas y alta compresión.

Delta Lake: Perfecto para lagos de datos que requieren transacciones ACID y versionado de datos, manteniendo la compatibilidad con Apache Spark.

ORC: Excelente para entornos Hadoop, donde se busca optimización en almacenamiento y acceso rápido a los datos.

Consumo de Datos (Derecha)

Parquet/ORC: Ambos son adecuados para análisis de datos y BI debido a su eficiencia en la lectura de grandes volúmenes de datos.

Delta Lake: Beneficioso cuando se necesitan garantías ACID y se trabaja con datos versionados.

Demostración de Rendimiento en Scala

Repositorio Github

El repositorio solo contiene una clase scala donde podeis ver el código para el benchmark. Obivamente han hecho falta bastantes configuraciones.

Fundamentalmente es una breve demostración en Scala utilizando JMH (Java Microbenchmark Harness) para comparar el rendimiento de Parquet, ORC, Delta, Avro en operaciones de lectura y escritura.

Ahora he ejecutado el siguiente comando, que me permite guardar toda la salida de la terminal en un archivo log. Esta vez no pierdo los resultados (actualizaré la imagen mañana). Tengo que investigar porque JMH no me está generando el json.

sbt jmh:run -i 1 -wi 1 -f1 -t1 -p dataset=small -rf json -rff src\main\scala\benchmark\results\benchmark_results.json > output.log 2>&1

Debe añadirse también a la configuración:

addCommandAlias(
"jmh-run-json",
s"""jmh:run -i 10 -wi 10 -f1 -t1 -rf json -rff "benchmarks/results_${Time.current}.json""""
)

Pero aunque le indico el minimo número de warm ups e iteraciones, me ejecuta siempre:

un -i 5 -wi 5 -f1 -t1 -bm thrpt -r 10s -w 10s

Como breve conclusión, podría decir que:

Parquet y ORC son excelentes para análisis y almacenamiento eficiente,

mientras que Delta Lake añade ventajas de transacciones ACID y versionado de datos.

Avro y JSON/CSV son útiles en la etapa de ingestión por su simplicidad y compatibilidad.

Referencias

Oficiales:

Papers:

Web:

--

--