Los sistemas de archivos distribuidos gestionan el almacenado de grandes cantidades de datos (sobrepasan la capacidad de una única máquina) a través de una red de dispositivos. Uno de los mayores retos a los que se enfrentan estos sistemas es el de permitir fallos en los nodos de la red sin sufrir pérdidas de datos.
Hadoop posee su propio sistema de archivos distribuidos llamado HDFS, pero también permite la integración con otros sistemas de almacenamiento (como por ejemplo Amazaon S3).
1 – El diseño de HDFS
Diseñado para almacenar archivos de gran tamaño (centenas de gigas o teras, incluso petabytes), con patrones de acceso de datos basados en streaming ('datos escritos una vez y leidos múltiples veces': datos almacenados para realizar diferentes análisis que involucran el conjunto completo del dataset o una gran parte de él, donde el tiempo de leer todos los datos es mucho más importante que la latencia de leer el primer registro) y donde el hardware utilizado es básico (no necesita equipos especiales).
Aplicaciones donde se necesite baja latencia en el aceso a los datos, con muchos archivos de pequeño tamaño, donde se requieran de múltiples procesos de escritura en los archivos o se precise de modificaciones arbitrárias en ciertas partes de los archivos no son idóneas para utilizar HDFS.
2 – Conceptos de HDFS.
2.1 – Bloques.
Bloque: ficheros en HDFS particionados en bloques (64 MB por defecto) y almacenados como unidades independientes (si ocupa menos, no consume un bloque entero).
2.2 – Namenodes y Datanodes.
Cluster HDFS: nodos operando en patrón namenode (maestro), datanode (trabajador). Namenode controla el espacio de nombres del sistema de ficheros y los datanodes donde se situan los bloques de cada fichero (información almacenada en local en dos ficheros: namespace image y edit log). Datanodes guardan y recuperan los bloques.
Mecanismos ante posibles fallos en el namenode:
- Hadoop se puede configurar para guardar backups de los metadatos del sistema de archivos en otros sistemas de arvhivos (por ejemplo, escribirlos también en local y en otro ordenador remoto).
- Es posible correr un namenode secundario (no actua como namenode, une y guarda la namespace image y el edit log para prevenir que este último crezca mucho). Se puede usar en el caso de que el namenode primario falle.
2.3 – HDFS federation.
En el caso de de un cluster muy grande, con muchos archivos, es posible que un namenode se vea desbordado por tanta información para almacenar. Se puede crear un federated HDFS cluster, donde existen diversos namenodes, cada uno de ellos manegando un namespace volume independientes de cada uno.
2.4 – Alta disponibilidad (high-availability) en HDFS.
Recuperarse de un fallo del namenode es posible (se arranca un nuevo namenode con alguna de las réplicas de los metadatos del sistema de archivos y se configuran los datanodes y clientes para que usen el nuevo). Hasta que todo se normaliza (tiempo de recovery mientras todos los datanodes reportar sus bloques al nuevo datanode) puede pasar un tiempo.
En las versiones 2.x se añade soporte de alta disponibilidad (High-availability), donde existe un par de namenodes, uno activo y otro pasivo. Si falla el activo, el pasivo puede asumir el nuevo rol sin una interrupción muy significativa.
3 – La interfaz de línea de comandos.
Se introducen los comandos básicos para realizar operaciones en el sistema de archivos y el sistema de permisos en los archivos guardados en HDFS (muy parecido al usado en Unix, POSIX).
3.1 – Operaciones básicas en el sistema de archivos.
3.2 – Permisos en los archivos en HDFS.
4 – Diferentes sistemas de archivos en Hadoop.
Hadoop no sólo funciona con HDFS como sistema de ficheros, sino que permite el uso de otros. Hadoop tiene una noción abstracta del sistema de ficheros (a través de una clase de Java abstracta org.apache.hadoop.fs.FileSystem). Bajo org.apache.hadoop existen diferentes subclases Java derivadas de esta para lidiar con diferentes sistemas (como por ejemplo fs.LocalFilesystem para acceder al sistema de almacenamiento local, o fs.s3.s3FileSystem para el sistema Amazon S3).
Hadoop proporciona diferentes inferfaces a los filesystems, generalmente usando el esquema URI del sistema al que queremos acceder:
% hadoop fs -ls file:/// --- usamos el URI file:/// para acceder al directorio / del sistema Local
5 – La interfaz Java.
En este apartado se introduce la API de Java para poder interactuar con los sistema de ficheros de Hadoop desde un programa en Java: la clase FileSystem (old) y la clase FileContext. Se centra sobre todo en la implementación de HDFS (clase DistributedFileSystem).
Se explica como leer y escribir datos en archivos, crear directorios, navegar por el sistema de archivos y como borrar datos en HDFS utilizando la API de Java.
5.1 – Leyendo datos de una URL Hadoop.
5.2 – Leyendo datos usando la API FileSystem.
5.2.1 – FSDataInputStream.
5.3 – Escribiendo datos.
5.3.1 – FSDataOutputStream.
5.4 – Directorios.
5.5 – Consultas al sistema de archivos.
5.5.1 – Metadatos de los archivos (FileStatus).
5.5.2 – Listando archivos.
5.5.3 – Patrones de archivos.
5.5.4 – PathFilter.
5.6 – Borrando datos.
6 – Flujo de datos.
Se explica como es el flujo de datos entre un cliente que interactua con HDFS (ejecuta un programa Java en una JVM que utiliza la API de Hadoop), el namenode y los datanodes cuando se lee y se escribe un fichero.
6.1 – Anatomía de una lectura de archivo.
6.2 – Anatomía de una escritura de archivo.
6.3 – Modelo de coherencia.
El modelo de coherencia describe la visibilidad de los datos en las escrituras y lecturas de un fichero: creando un archivo en HDFS es visible inmediatamente en el filesystem namespace, pero cualquier dato que se escriba en el fichero no se garantiza que sea visible en el instante por cualquier otro cliente (existen metodos para garantizarlo: método sync() en FSDataOutputStream).
7 – Transferencia de datos con Flume y Sqoop.
En vez de escribir aplicaciones para mover datos hacia HDFS es mejor considerar las herramientas Flumne y Spooq para realizar las transferencias.
8 – Copia en paralelo con distcp.
Hadoop proporciona un programa llamado distcp para transferir datos entre dos clusters HDFS.
9 – Archivos HAR.
HDFS almacena ficheros de pequeño tamaño de forma ineficiente, ya que cada fichero se graba en un bloque (aunque fisicamente no lo gaste completamente) y los metadatos de cada bloque deben mantenerse en la memoria del namenode, por lo que un gran número de ficheros puede consumir demasiada memoria del namenode.Hadoop proporciona los ficheros HAR como forma de 'empaquetar' diferentes ficheros en bloque HDFS de forma más eficiente.
No hay comentarios:
Publicar un comentario