Tema 2
Tema 2
Tema 2
HDFS y MapReduce
Índice
Esquema 3
Ideas clave 4
2.1. Introducción y objetivos 4
2.2. Introducción a HDFS 4
© Universidad Internacional de La Rioja (UNIR)
A fondo 26
Test 28
© Universidad Internacional de La Rioja (UNIR)
HDFS Y MAPREDUCE
HDFS MAPREDUCE
Necesidad de Google de almacenar mucha información Manejo por comandos que Motor de procesamiento distribuido de
comienzan por hdfs dfs los datos guardados en HDFS
Es un clúster de máquinas convencionales (escalable)
Usa las CPU de los datanodes
(2003) Google File System, precursor de HDFS hdfs dfs -ls
Tema 2. Esquema
Ingeniería para el Procesado Masivo de Datos
Esquema
3
Ideas clave
El artículo publicado por Ghemawat, Gobioff y Leung (2003) acerca de Google File
© Universidad Internacional de La Rioja (UNIR)
System (GFS) fue el germen del sistema de archivos distribuido HDFS (Hadoop
Distributed File System), que constituye una parte fundamental del ecosistema
Hadoop y el cual se ha seguido utilizando sin apenas cambios desde que se
introdujo por primera vez.
HDFS es, en realidad, un software escrito en lenguaje Java, que se instala encima del
sistema de archivos de cada nodo del clúster. El software HDFS se encarga de
proporcionarnos una abstracción que nos da la ilusión de estar usando un sistema
de archivos, pero, por debajo, continúa usando el sistema de archivos nativo del
sistema operativo (por ejemplo, en el caso de máquinas Linux, que son las más
habituales para instalar HDFS, estará utilizando por debajo el conocido sistema de
© Universidad Internacional de La Rioja (UNIR)
La mayoría de los comandos que ofrece HDFS para manejar archivos se llaman igual
que los comandos del sistema de archivos de Linux, con el fin de facilitar su uso a
usuarios que ya estaban acostumbrados a trabajar con este sistema operativo. No
obstante, esto no debe confundirnos: la ejecución de un comando en el sistema de
archivos local (por ejemplo, ls, para mostrar el contenido de un directorio de
nuestro ordenador) desencadena unas acciones muy diferentes a la ejecución del
comando con el mismo nombre, pero en HDFS (precedido por las palabras hdfs
dfs).
Bloques de HDFS
Los bloques de datos suelen estar replicados para ofrecer alta disponibilidad y
máximo paralelismo: cada bloque está en k máquinas, donde k es el factor de
replicación. HDFS fija por defecto un factor de replicación de 3, aunque este
valor es configurable individualmente para cada fichero mediante el comando
hadoop dfs -setrep -w 3 /user/hdfs/file.txt.
© Universidad Internacional de La Rioja (UNIR)
Figura 1. Salida dada por el comando fsck para un archivo de 500 MB subido a HDFS.
Cuando se instala HDFS en un clúster, cada nodo puede utilizarse como datanode o
como namenode. El namenode (debe haber, al menos, uno) mantiene la estructura
de directorios existentes y los metadatos asociados a cada archivo. Por su parte, los
datanodes almacenan bloques de datos y los devuelven a petición del namenode o
del programa cliente que está accediendo a HDFS para leer datos.
Se trata de una copia preventiva frente a fallos del namenode. Existen dos maneras
complementarias de llevarla a cabo:
afecta en nada a los archivos o directorios que no cuelgan de esa jerarquía. Los
datanodes sí pueden almacenar indistintamente bloques de archivos de varios
namespaces (es decir, de varios subárboles).
Proceso de lectura
El proceso que se lleva a cabo cuando un comando necesita leer un archivo de HDFS
es el siguiente (figura 2):
Proceso de escritura
Para cada bloque, los datanodes (varios, debido al factor de replicación) que lo
guardarán forman un pipeline. El primer datanode escribe el bloque y lo reenvía al
segundo, y así sucesivamente. Según se van escribiendo, se devuelve una señal de
confirmación ack, que también se almacena en una cola. En caso de fallo de algún
datanode durante la escritura, se establecen mecanismos para que el resto de
datanodes del pipeline no pierdan ese paquete y asegurar la replicación. Son los
propios datanodes los que gestionan la replicación de cada bloque, sin intervención
del namenode, para evitar cuellos de botella. Solo se necesita la intervención del
namenode de forma ocasional, con el fin de preguntarle dónde escribir el siguiente
bloque de datos.
© Universidad Internacional de La Rioja (UNIR)
En todos los comandos, se puede usar hadoop dfs o hdfs dfs indistintamente,
aunque la segunda opción está más extendida en la actualidad. Recordemos que lo
que estamos haciendo es ejecutar un programa cliente llamado hdfs desde
cualquiera de los nodos que forman parte de HDFS.
HDFS.
del archivo presente en HDFS. Debe usarse con cuidado, ya que lo habitual es
que los ficheros sean grandes y el comando imprime todo el fichero. Para paginar
la visualización, se recomienda redirigir (con la barra vertical | ) la salida de este
comando hacia el comando more del sistema de archivos local de Linux: hdfs dfs
–cat /ruta/hdfs/fichero.txt | more
© Universidad Internacional de La Rioja (UNIR)
borrar una carpeta completa de forma recursiva (es decir, con todos sus
subdirectorios) mediante la opción –r : hdfs dfs –rm –r /ruta/carpeta/
¡Cuidado!
© Universidad Internacional de La Rioja (UNIR)
chmod del sistema de archivos de Linux, que se utiliza para cambiar los permisos
Una vez que Google tenía resuelto el problema del almacenamiento de ficheros
masivos en el sistema de ficheros distribuido Google File System (GFS), Dean y
© Universidad Internacional de La Rioja (UNIR)
El punto de partida son archivos muy grandes almacenados (por bloques) en HDFS
(en aquel momento, aún era GFS). ¿Podríamos aprovechar las CPU de los datanodes
del clúster para procesar en paralelo (simultáneamente) los bloques de un archivo?
No queremos mover datos (el tráfico de red es muy lento): llevamos el cómputo (el
código fuente de nuestro programa) al lugar donde están almacenados los datos
(es decir, a los datanodes, y no al revés, como ocurría en el modelo tradicional de
aplicación). Las CPU de los datanodes van a procesar (preferentemente) los datos
que hay en ese datanode.
Supongamos que queremos resolver un problema que consiste en, dado un texto,
saber cuántas veces aparece en él cada palabra. Nuestro punto de partida es un
fichero que contiene el texto y que está almacenado en HDFS. Por tanto, está
particionado en varios bloques, cada uno de los cuales contiene un fragmento del
texto. Asumimos que el texto está almacenado en formato ASCII, es decir, el fichero
(y, por extensión, cada uno de sus bloques) contiene líneas de texto, tal como se
indica en los rectángulos azules de la figura 4.
Fuente: https://openclassrooms.com/fr/courses/4297166-realisez-des-calculs-distribues-sur-des-donnees-
massives/4308626-divisez-et-distribuez-pour-regner#/id/r-4362891
A continuación, las tuplas que genera la fase map son enviadas por la red que
conecta los nodos del clúster: la librería de MapReduce, de forma automática y
transparente al programador, lleva a cabo la operación shuffle and sort, mostrada
en rosa. Esta, a partir de los resultados en verde, genera tuplas formadas por una
palabra y una lista asociada (más adelante, explicaremos su significado). Lo que está
sucediendo es que el propio framework está agrupando todas las tuplas que tienen
la misma clave y está creando una lista con todos los valores asociados a esa clave
común. Esto lo repite por cada clave diferente que encuentre en las tuplas
generadas por la función map del usuario.
y la lista con el número de ocurrencias asociadas a ella) y genera, para cada una de
ellas, un resultado como el mostrado en los rectángulos naranjas.
La función map que implementa el usuario debe recibir como entrada una tupla
(clave_entrada, valor). En este problema, clave_entrada es el número de línea
(ignorado) y valor representa una línea completa de texto. Es el framework el que,
de forma automática, invoca, tantas veces como sea necesario, la función que ha
implementado el usuario y le pasa los argumentos que hemos indicado. La
invocación y ejecución de la función map se lleva a cabo de manera distribuida, en
cada nodo del clúster (en los datanodes, que es donde residen los bloques de HDFS
© Universidad Internacional de La Rioja (UNIR)
que contienen los fragmentos del texto que actúa como datos de entrada).
Inconvenientes de MapReduce
Por otro lado, y relacionado con el punto anterior, para mover datos se necesita,
en primer lugar, escribirlos temporalmente en el disco duro de la máquina
origen, enviarlos por la red y luego escribirlos temporalmente en el disco duro de
la máquina destino (el shuffle siempre va de disco duro a disco duro) para,
finalmente, pasarlos a la memoria principal de dicho nodo.
Ghemawat, S., Gobioff, H. y Leung, S-T. (2003). The Google File System. ACM SIGOPS
Operating Systems Review, 37(5), 29-43.
https://doi.org/10.1145/1165389.945450
© Universidad Internacional de La Rioja (UNIR)
Hadoop Apache. (2020). HDFS Users Guide. The Apache Software Foundation.
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-
hdfs/HdfsUserGuide.html
Aquí puedes consultar una definición completa sobre Hadoop. Son también
interesantes todos los demás términos contenidos en el glosario, todos
relacionados con las tecnologías big data.
© Universidad Internacional de La Rioja (UNIR)
Chansler, R., Kuang, H., Radia, S., Shvachko, K. y Srinivas, S. (s. f.). The Hadoop
distributed file system. En A. Brown y G. Wilson (eds.), The architecture of open source
applications. Elegance, evolution, and a few fearless hacks. Aosa Book.
http://www.aosabook.org/en/hdfs.html
A. Es imposible que dos réplicas del mismo bloque caigan en el mismo nodo.
B. Es imposible que dos réplicas del mismo bloque caigan en el mismo rack.
C. Las dos respuestas anteriores son falsas.