Formatos de ficheros en Hadoop

Como se comentaba en anteriores artículos, Hadoop es un ecosistema de aplicaciones que permite implementar plataformas Big Data distribuidas, funcionales y escalables.

El ecosistema Hadoop está diseñado para procesar grandes volúmenes de datos de forma distribuida a través del modelo de programación MapReduce. Los dos componentes principales en su núcleo son: HDFS (Hadoop Distributed File System) y MapReduce (modelo de programación distribuida).

En este artículo, vamos a repasar los conceptos clave de HDFS y el porqué es importante la elección de un buen formato de almacenamiento de datos.

HDFS

Hadoop Distributed File System (HDFS) es un sistema de ficheros distribuido diseñado para el procesamiento de datos a gran escala donde la escalabilidad, flexibilidad y el rendimiento es crítico. Hadoop funciona en una arquitectura maestro/esclavo para almacenar los datos en HDFS y se basa en el principio de almacenar pocos ficheros muy grandes.

En HDFS se ejecutan dos servicios: Namenode y Datanode. El Namenode gestiona el espacio de nombres del sistema de ficheros, además de mantener el árbol del sistema de ficheros y los metadatos para todos los ficheros y directorios. Esta información se almacena de forma permanente en el disco local en forma de dos ficheros: la imagen del namespace y el log de ediciones. El Namenode también conoce los Datanodes donde se ubican los bloques de un fichero.

De forma similar a otros sistemas de ficheros, HDFS también tiene el concepto de bloque como cantidad mínima de datos que se pueden leer y escribir. Mientras que en otros sistemas de ficheros los bloques suelen ser de pocos kilobytes, el tamaño por defecto de un bloque de HDFS es de 128MB. Los bloques de HDFS son más grandes con el objetivo de minimizar el coste de las búsquedas, ya que si es bloque es lo suficientemente grande, el tiempo que lleva transferir los datos desde el disco puede ser mayor que el tiempo necesario para buscar desde el inicio del bloque. Los bloques encajan bien con la replicación para proporcionar tolerancia a fallos y disponibilidad. Cada bloque se replica en un número de pequeñas máquinas separadas

Hadoop, como cualquier sistema de ficheros estándar, permite almacenar información en cualquier formato, ya sean datos estructurados, semiestructurados o no estructurados. Además, también proporciona soporte a formatos optimizados para el almacenamiento y procesamiento en HDFS.

¿Por qué elegir un buen formato?

Un formato de fichero es la definición de cómo se almacena la información en HDFS. Hadoop no tiene un formato de fichero predeterminado y la elección de un formato depende del caso de uso.

El gran problema en el rendimiento de las aplicaciones que utilizan HDFS como MapReduce o Spark es el tiempo de búsqueda de la información y el tiempo de escritura. Gestionar el procesamiento y almacenamiento de grandes volúmenes de información es complejo, además de otras dificultades como la evolución de esquemas o restricciones de almacenamiento.

La elección de un formato de fichero apropiado puede tener los siguientes beneficios:

  1. Tiempo de escritura óptimo
  2. Tiempo de lectura óptimo
  3. Divisibilidad de ficheros
  4. Esquema adaptable y soporte a la compresión

Formatos para Hadoop

A continuación se presentan algunos de los formatos más comunes del ecosistema Hadoop:

Text/CSV

Un fichero en texto plano o CSV es el formato más común tanto fuera como dentro del ecosistema Hadoop. La gran desventaja en el uso de este formato es que no soporta la compresión de bloque, por lo que la compresión de un fichero CSV en Hadoop puede tener un alto coste en la lectura.

SequenceFile

El formato SequenceFile almacena los datos en formato binario. Este formato acepta la compresión, sin embargo, no almacena los metadatos y la única opción en la evolución de su esquema es añadir al final los nuevos campos. Este suele utilizarse para almacenar datos intermedios en la entrada y salida de procesos MapReduce.

Avro

Avro es un formato de almacenamiento basado en filas (row-based). Este formato incluye en cada fichero, la definición del esquema de sus datos en formato JSON, mejorando la interoperabilidad y permitiendo la evolución del esquema. Avro también permite la compresión de bloque además de su divisibilidad, por lo que es una buena elección para la mayoría de los casos de uso en Hadoop.

Parquet

Parquet es un formato de almacenamiento binario basado en columnas (columna-based) que puede almacenar estructuras de datos anidados. Este formato es muy eficiente en términos de operaciones de disco entrada/salida cuando se especifican las columnas necesarias que deben usarse. Particularmente, este formato está muy optimizado para utilizarlo con Cloudera Impala.

RCFile (Record Columnar File)

RCFile es un formato columnar que divide los datos en grupos de filas, y en su interior, los datos se almacenan en columnas. Este formato no soporta la evaluación del esquema y si se desea añadir una nueva columna es necesario reescribir el fichero, haciendo que el proceso sea lento.

ORC (Optimized Row Columnar)

ORC se considera una evolución del formato RCFile y tiene todos sus beneficios junto a algunas mejoras como una mejor compresión, permitiendo realizar consultas más rápidas. Este formato tampoco soporta la evolución del esquema.

 

 

Cada formato tiene sus ventajas y desventajas, y cada etapa del procesamiento de los datos necesitará de un formato diferente para ser más eficiente. El objetivo es elegir un formato que maximice las ventajas y minimice los inconvenientes. La elección de un formato de fichero HDFS adecuado al tipo de trabajo que se va a realizar con él puede asegurar que los recursos se utilizarán de una forma eficiente.

Analizando los diferentes casos de uso y las características de los distintos formatos de ficheros utilizados en Hadoop, se obtienen las siguientes recomendaciones:

  • El formato de texto plano o CSV, sólo sería recomendable en caso de que vayan a realizarse extracciones de datos desde Hadoop o se realice una carga masiva de datos desde un fichero.
  • El formato SequenceFile se recomienda en caso de almacenar datos intermedios en trabajos MapReduce.
  • Avro es una buena elección en caso de que el esquema de datos pueda evolucionar a lo largo del tiempo.
  • Parquet y ORC se recomienda cuando el rendimiento de las consultas es importante.

Deja un comentario

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

*
*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.