Recuerda que puedes descargarte algunos de los ejemplos en la pestaña de Código Fuente
Mostrando entradas con la etiqueta Clúster Hadoop. Mostrar todas las entradas
Mostrando entradas con la etiqueta Clúster Hadoop. Mostrar todas las entradas

miércoles, 10 de julio de 2013

Técnicas de Debugging y Logging

Debugging

Depurar los programas MapReduce es muy complicado, ya que cada instancia de un Mapper se ejecuta en una tarea diferente y quizás en máquinas diferentes, así que adjuntar una técnica de debug en el proceso no es tarea fácil.

El problema es que con cantidades tan grandes de datos puede haber una entrada inesperada o errónea y es un evento que hay que tener en cuenta y controlar.
Porque piénsalo de esta forma, estamos realizando un proyecto de Big Data, eso quiere decir que estamos tratando tales cantidades de datos que los procesos pueden tardar horas o incluso días, imaginemos que a mitad de ese proceso que tarda días hay una entrada de un dato inesperado y el programa falla por no haber tomado ninguna medida.
La conclusión es que al desarrollador sólo le queda tomar una serie de estrategias para evitar este tipo errores:
  • Código defensivo: siempre suponer que un dato puede ser incorrecto o esperar que las cosas vayan mal. Habría que añadir control de excepciones o código que controle los posibles fallos.
  • Empieza un desarrollo pequeño y ve agrandándolo poco a poco
  • Escribe pruebas unitarias, utilizando, por ejemplo, MRunit.
  • Prueba primero en local con cantidades reducidas de datos, luego pasa a modo pseudodistribuído (asegurándote que el entorno es similar al del clúster) y finalmente prueba en todo el clúster.
  • Utiliza Counters, por ejemplo, para conocer el número de entradas inválidas.

Para hacer pruebas en local no se usa HDFS, se usa el sistema de ficheros local y sólo se ejecuta un proceso llamado LocalJobRunner.


Logging

Como logging lo más efectivo es usar librerías como el log4java, ya que éste se puede configurar en niveles y desactivarlo en situaciones de producción.

Como buenas prácticas nunca se debería usar println como estrategia de loggin cuando hacemos nuestras primeras pruebas, ya que posteriormente deberíamos borrarlo en todo el código. Si dejáramos estas líneas y pasáramos el código al clúster en modo producción, podría afectar considerablemente a los tiempos de ejecución, piensa que son procesos que necesitamos que sean lo más rápidos posibles y el realizar un println supone un consumo de tiempo ejecutando el comando y realizando la escritura.
En el clúster deben estar desactivadas todas las escrituras de logging innecesarias (no perjudica el rendimiento el hacer loggin en los métodos setup y cleanup).







jueves, 31 de enero de 2013

El Clúster Hadoop y sus 5 demonios


Una vez que hemos visto teóricamente qué es Hadoop y sus dos partes principales HDFS y MapReduce, vamos a ver quién hace que todo esto funcione.

Un Clúster Hadoop es un conjunto de máquinas donde se ejecuta HDFS. Cada máquina es un nodo del clúster. La ventaja de este tipo de sistemas distribuídos es que las máquinas pueden ser de bajo coste y que la infraestructura puede escalar de forma horizontal facilmente.

Un Clúster puede tener como poco un sólo nodo y como máximo varios miles (hasta 30 000 a día de hoy según la web de Apache). Cuantos más nodos, mejor rendimiento.

Para que Hadoop funcione hay 5 demonios que lo manejan repartidos en dos tipos de máquinas.
Los 5 demonios son:
  • NameNode
  • Secondary Namenode
  • DataNode
  • JobTracker
  • TaskTracker

Cada demonio se ejecuta en su propia máquina virtual de Java (JVM)

Y los dos tipos de máquinas son:
  • Master Node: Que incluye el NameNode, el Secondary NameNode y el JobTracker
  • Slave Node: Que incluye los DataNode y el TaskTracker.

Algo muy importante que hay que tener claro es que no es lo mismo HDFS que MapReduce, en una aplicación Hadoop participan las dos partes, y quizás varios de los demonios se están ejecutando en las mismas máquinas, pero hay que tener claro que no son lo mismo, cuál pertenece a qué parte y cómo funcionan.

Demonios Hadoop

Antes de empezar a describir los distintos demonios estaría bien aclarar la terminología:

  • Job: Es una ejecución completa de una aplicación. La ejecución de todos los Mappers y Reducers de todos los datos.
  • Task: Es la ejecución de un sólo Mapper o de un sólo Reducer sobre un conjunto de datos.


NameNode

Es el nodo máster encargado de gestionar el namespace del sistema de ficheros.
También se encarga del mantenimiento de los metadata de todos los ficheros y directorios que forman parte del sistema HDFS.

Conoce los DataNodes del clúster y sabe cómo están repartidos en estos DataNodes los diferentes bloques que pertenecen a un fichero.

Todos los metadata los tiene en RAM para acceder más rápido, aunque también existe una copia de esta información en el disco duro (de esta forma, no se pierden estos metadata si se apaga el NameNode),

Tiene dos funciones:

Por un lado, cuando llega un nuevo fichero, es quien se encarga de decir qué bloques van y dónde en el clúster. No hay movimiento de datos a través del NameNode, sino que ese fichero se particiona y los bloques van directamente a guardarse en los DataNodes. Luego el NameNode actualiza su metadata.

Por otro lado, cuando una aplicación cliente quiere leer un fichero ésta se comunica con el NameNode para determinar qué bloques forman el fichero y dónde están y posteriormente ir a buscarlos a los DataNodes correspondientes.

Si el NameNode deja de funcionar, el sistema no puede seguir usándose. Y si además el NameNode se destruye, todos los datos del clúster se perderían ya que no habría forma de reconstruir los ficheros en base a los bloques que se encuentran en los DataNodes (a no ser que tengamos una copia de seguridad de los metadata de HDFS en otro servidor).

Secondary Namenode

Este demonio causa un poco de confusión, ya que a primera vista parece una copia de seguridad o backup del NameNode, pero hay que tener mucho cuidado, ya que NO lo es.

Su papel consiste en realizar una tarea de mantenimento de los ficheros de metadata del NameNode (consolidando el fichero "fsimage" con el fichero de logs "edits").

También hay que decir que hay un cambio entre la versión CDH3 y la versión CDH4 de Hadoop.
En la versión CDH3, sigue siendo el Secondary NameNode que se encarga tan sólo de tareas de mantenimiento del NameNode.
En la versión CDH4, se introduce un nuevo concepto: la Alta Disponibilidad. Si esta está activa, el Secondary NameNode desaparece y pasa a ser el Standby NameNode.

DataNode

Los DataNode son los nodos encargados de almacenar los bloques de datos en el clúster Hadoop.
Almacenan los bloques e informan periódicamente al NameNode las listas de bloques que están almacenando.

Cuando un cliente quiere leer un fichero, primero se comunica con el metadata del NameNode quien le dice dónde están y cómo se distribuye el fichero a leer.
Luego el cliente pasaría a conectarse directamente con los DataNode correspondientes sin que los datos pasen por el NameNode.

JobTracker

Se encarga de gestionar todo el Job (uno o varios) que ha solicitado un cliente.
Es decir, cuando recibe la petición, asigna tareas (task) Map y Reduce a los nodos del clúster.

También se encarga de saber cuáles son TaskTracker existentes. En caso de fallo de un TaskTracker, recupera las tareas map o reduce que ejecutaba ese TaskTracker y las asigna a otro.

Finalmente, gestiona el scheduling entre los distintos jobs MapReduce.

TaskTracker

Cada nodo ejecuta un demonio del TaskTracker, y es el responsable de crear instancias del Map o del Reduce  y de reportar la situación del proceso al JobTracker.

Para disfrutar de la localización de los datos, es imprescidible que el TaskTracker esté instalado en cada nodo que contenga un DataNode.


Por último vamos a ver que existen tres modos de ejecutar un cluster Hadoop:

  • Local: No se usa HDFS, sino el sistema de ficheros nativo del ordenador. Todo Hadoop se ejecuta en un único ordenador. Tampoco existe ningún demonio MapReduce. Cuando un cliente ejecuta un Job MapReduce en este modo el programa cliente "contiene" el demonio JobTracker y TasckTracker.
  • Pseudo-Distribuído: En una máquina tienes los cinco demonios funcionando.
  • Distribuído: Dispones de un clúster de dos o más nodos con los demonios separados en Master Nodes y Slave Nodes y funcionando en paralelo.