Qué es Hadoop y para qué sirve ?
Primero vamos a poner un problema, y luego alguien lo va a solucionar muy bien.
Por allí al 200X Google tenía un problema, y este problema era básicamente una cantidad gigante de datos con que trabajar. Las soluciones que había por aquel entonces o bien no eran lo suficientemente potentes o eran demasiado caras, así que teniendo los recursos, la gente de Google diseñó su propia solución, que finalmente implementó, provó, puso en producción y finalmente, explicó a la comunidad mediante una serie de papers:
- MapReduce: Simplified Data Processing on Large Clusters del que ya hablé en este mismo blog.
- The Google File System.
Aquí, igual que en el taller me voy a servir de una muy buena definición de Hadoop, de Parand Tony Darugar:
"Flexible infrastructure for large scale computational and data processing on a network of commodity hardware".Vamos a analizar la frase:
- Data processing: Hadoop no está pensado para problemas matemáticos, no estamos calculando simulaciones, no estamos calculando grafos. Hadoop es para procesar datos. Si no tienes muchos datos de entrada te estás equivocando de Framework.
- Network: I por qué en una red de ordenadores? pues porqué estás analizando tantos datos que no te caben en una sola máquina. Si los datos te caben en una sola máquina te estás equivocando de Framework.
- Large Scale: Muchos datos y muchas máquinas.
- Commodity Hardware: Tenemos una red de máquinas. El hardware va a fallar, estadísticamente los discos duros van a estropear-se, la RAM se averiará y las placas base se van a fundir. Si tenemos mucho hardware tenemos muchas posibilidades de que hayan desgracias, así que Hadoop está preparado para correr en máquinas "baratas". Si el hardware se va a estropear y habrá que reemplazarlo, al menos que sea barato no?
- Flexible: Si sabemos que el hardware se va a estropear durante la ejecución, Hadoop debe estar preparado para soportarlo. Vamos a ver un poco más adelante más detalles de esto, pero para empezar diré que el sistema de ficheros tiene réplicas de los ficheros (por defecto 3), por lo tanto si una máquina se estropea durante la ejecución no pasa nada, el fichero está en 2 otras máquinas, Hadoop se va a enterar, va a clasificar la máquina como "averiada" y va a continuar el job en otra parte.
He insistido bastante en los "muchos datos", cuánto es exactamente "muchos datos"? pues es tan fácil como: "BIG DATA es cuando la cantidad de datos es un problema".
Para alguien serán 100 gb, para alguien serán 1Tb y para algun otro seran petabytes.
Vamos a profundizar un poco más con el tema del "problema". Yo personalmente creo que hay 3:
- Tiempo: Las herramientas que uso funcionan bien con esta cantidad de datos, pero tarda mucho. Vamos a imaginar que tenemos una base de datos sobre la qual hay que correr una serie de procesos, el departamento de márketing necesita datos actualizados cada 10 horas. Si el proceso finaliza, pero tarda 15 horas tenemos un problema.
- Las herramientas dejan de funcionar: Tenemos un programa que funciona bien, crecen los datos y la herramienta cada vez va más lenta, pero no es un problema. Llega un momento que la herramienta simplemente de queda congelada con el input de datos. Tenemos otro problema.
- Los datos no caben en la máquina: Tenemos 1 Terabyte (o lo que sea) de datos a tratar y simplemente los datos no caben en la máquina y hay que moverlos a trozos por la red.
Worflow de trabajo en Hadoop.
Ya sabemos qué hace Hadoop y ya sabemos cuándo tiene sentido empezar a utilizarlo. Ahora bien, cómo se trabaja?
Hadoop consta de dos partes (como veremos en más detalle en el siguiente punto), un motor de map/reduce y un sistema de ficheros distribuido. Lo más importante en este punto es que nos imaginemos a Hadoop como una caja negra que es capaz de almacenar y transformar datos. Por lo tanto para trabajar lo que tenemos que hacer es:
- Poner los datos nuevos en Hadoop (en caso de que haya): Ponemos los logs del día, los usuarios que se han dado de alta hoy, los eventos del día, etc, en el sistema de ficheros.
- Tratar los datos con un programa map/reduce.
- Sacar los datos del sistema de ficheros para ponerlos a un lugar dónde sean útiles. Vamos a recordar que de momento Hadoop es una caja negra, no es fácil que los del departamento de márketing usen los datos que hay en Hadoop, así que hay que sacarlos de allí y ponerlos en una base de datos, una nosql, una página web, lo que sea.
Cómo funciona Hadoop? (Map/Reduce y su amigo el DFS)
Hemos dicho que Hadoop almacena y transforma datos, almacena con un sistema de ficheros y trata los datos con un motor de map/reduce, vamos a verlos:
(H)DFS: Hadoop Distributed File System.
Vamos a empezar por el sistema de ficheros distribuido. Vamos a dejar claro que un sistema de ficheros distribuido es un tema muy serio y complejo. Nadie quiere poner sus ficheros en un sistema experimental con el riesgo de que desaparezcan ficheros, se corrompan o sean inaccesibles, por lo tanto, el principal requerimiento es su estabilidad y robustez.
El HDFS fue diseñado a partir del paper del Google File System, no me voy a liar mucho con la explicación de cómo funciona, pero voy a comentar algunas de sus características más importantes:
- Simple by design: Aunque internamente un sistema de ficheros es muy complejo, el HDFS ha sido diseñado y implementado con un conjunto muy básico y limitado de funcionalidades. Así que no nos podemos esperar grandes "virguerías", al menos a nivel de usuario.
- Robusto y replicado: Es robusto, recordemos que Hadoop está diseñado para ejecutarse en redes de hardware que puede estropearse en cualquier momento. El sistema de ficheros debe ser capaz de continuar trabajando efectivamente hasta un cierto nivel de error tolerable. Una de las características más importantes es que los ficheros están partidos por bloques, y que cada bloque está replicado 3 veces en el clúster, así que si una máquina cae o un disco duro se estropea no pasa nada, aún tenemos dos copias del bloque del fichero en la red.
- Optimizado para Big Data: Los bloques son de 64 mb por defecto, por lo tanto, optimizado para la lectura y escritura de volumenes de datos grandes.
- Escalable: El sistema debe escalar horizontalmente, si necesitas más espacio es tan fácil como poner más máquinas o ampliar los discos duros. El máster se va a encargar de repartir los bloques entre los nuevos nodos de forma transparente.
- Transparente: Hemos dicho que el sistema es sencillo de cara al usuario y que es robusto y escalable, que es tolerante a fallos y que balancea su carga automáticamente y además, sin que el usuario se entere de lo que está pasando. El nodo máster se encarga de todo de forma totalmente transparence. En caso de que una máquina se estropee, el máster va a encargarse de ponerla en una lista negra y va a mirar qué bloques de ficheros contenía, y va a replicarlos (cogiéndolos de otras máquinas) hasta que el número de replicas vuelva a ser el deseado.
A nivel un poco más técnico, todo el sistema de ficheros está controlado por un nodo máster que se llama el NameNode, podéis ver más información aquí.
Map/Reduce
El motor de map/reduce es la parte que realiza los cálculos y transformaciones sobre los datos. Básicamente se trata de una serie de componentes software que ejecutan un programa, programado en Java (o alguna otra alternativa que veremos más tarde) que sigue el model de programación del mismo nombre (map/reduce).
Bien, pero qué es esto del map/reduce? pues se trata de un esquema de programación paralela que tiene sus orígenes en la programación funcional. Encontraréis mucha más información por la red, pero lo básico y lo importante ahora mismo es entender un poco el concepto, que es bastante sencillo.
Tenemos un problema, A, este problema es muy grande y no se puede tratar de forma individual, por lo tanto vamos a coger una función, a la que llamaremos mapper y la vamos a aplicar a trozos de A, de forma que tendremos:
A1 --> Mapper --> A'1
A2 --> Mapper --> A'2
...
Ax --> Mapper --> A'x
Ya tenemos parte del problema resuelto, pero en trozos, ahora toca aplicar el reducer, que es otra función que sabe interpretar y juntar los pequeños resultados que nos ha dado el mapper. De tal modo que:
[A'1, A'2, ... , A'x] --> Reducer --> Resultado.No es más que aplicar el 'divide y vencerás' sobre un fichero muy grande. Lógicamente no todos los problemas se pueden resolver con este modelo de programación, es por esto que cale ver si Hadoop es la mejor solución antes de lanzarnos a crear un proyecto.
Ejemplos de código:
En el taller vimos un par de ejemplos (muy básicos y sencillos cabe decir). Están colgados en github y bastante comentados. Otro recurso para tutoriales de programación Java en Hadoop en su página oficial, bastante más completo.
Clúster virtual en EC2 vs Clúster local.
Tengo que admitir que soy bastante novato en este aspecto. Siempre he tenido la suerte de trabajar con un clúster dedicado así que eché una ojeada rápida para crear un pequeño clúster virtual en EC2. Según he visto hay 3 possibilidades:
- Pico y pala: Creas los nodos manualmente y te instalas Hadoop.
- Scripts en el src de Hadoop.
- Apache Whirr.
Lógicamente escogí la más rápida, en este caso Whirr, que es un proyecto que trata de facilitarnos la creación de clústeres en plataformas de virtualización. El proyecto es bastante joven y aún le falta, pero ya se puede utilizar con unos resultados muy satisfactorios. Con este simple fichero de configuración pude crear un cluster en amazon:
whirr.cluster-name=hadoopCreo que es bastante autoexplicativo, pero podéis encontrar más detalles en su página web.
whirr.instance-templates=
1 hadoop-namenode+hadoop-jobtracker,
2 hadoop-datanode+hadoop-tasktracker
whirr.provider=aws-ec2
whirr.identity=*************
whirr.credential=***********
whirr.hardware-id=c1.xlarge
whirr.image-id=us-east-1/ami-da0cf8b3
whirr.location-id=us-east-1
La clara ventaja sobre los clústeres virtuales sobre los clústeres físicos es claramente la inversión inicial ya que no hay que comprar las máquinas (y el espacio en el datacenter), ni pagar mensualmente la electricidad + mantenimiento, bla bla. Aunque sí que tengo que decir que he oído que el rendimiento de un clúster dedicado es mucho mayor a la que nos encontraremos utilizando un clúster virtual. Del orden de 10 veces más rápido, aunque este número tendría que verse de forma un poco más "científica", cómo dije, esto es un rumor que me dijo un usuario de EC2 que se pasó a clúster dedicado.
Ecosistema de Hadoop
Hasta ahora he hablado del core de Hadoop. Como se ha visto es muy potente, pero es bastante espartano y no da muchas facilidades amigables al usuario o programador. No obstante el proyecto tuvo una gran adopción, debido a que era software libre y a que básicamente era lo único disponible. Esto causó que muchas empresas pusieran recursos para mejorar el proyecto y crear pequeños proyectos auxiliares que con el tiempo se han convertido en partes importantes de un ecosistema muy activo.
Podéis encontrar más información sobre los proyectos que considero más interesantes en un post que ya escribí en este mismo blog.
Preguntas?
Esto ha sido una pequeña introducción a Hadoop, muy a grosso modo y sin entrar en detalles peliagudos. Como siempre, si tenéis alguna duda no dudéis en preguntarla en la sección de comentarios o bien contactando conmigo.
Hasta ahora he hablado del core de Hadoop. Como se ha visto es muy potente, pero es bastante espartano y no da muchas facilidades amigables al usuario o programador. No obstante el proyecto tuvo una gran adopción, debido a que era software libre y a que básicamente era lo único disponible. Esto causó que muchas empresas pusieran recursos para mejorar el proyecto y crear pequeños proyectos auxiliares que con el tiempo se han convertido en partes importantes de un ecosistema muy activo.
Podéis encontrar más información sobre los proyectos que considero más interesantes en un post que ya escribí en este mismo blog.
Preguntas?
Esto ha sido una pequeña introducción a Hadoop, muy a grosso modo y sin entrar en detalles peliagudos. Como siempre, si tenéis alguna duda no dudéis en preguntarla en la sección de comentarios o bien contactando conmigo.
Hola Marc,
ResponderEliminarGenial entrada. Simplemente dejo mi granito de arena :).
En mi caso, la opción más sencilla para generar cluster Hadoop es la de hacer uso del servicio Elastic Map/Reduce (http://aws.amazon.com/elasticmapreduce/). Básicamente se reduce a decirle donde tienes los scripts de entrada (tiene múltiples entradas como Hive, Pig, etc, etc), los directorios de entrada (almacenados en S3) y la salida (también en S3) y cuantas máquinas quieres.
El proceso anterior se puede llevar a cabo desde la propia consola de administración de Amazon o desde su API Rest (para la cual existen varios clientes).
Básicamente lo que realiza el proceso anterior es levantar N máquinas virtuales, configurar un cluster Hadoop en todas ellas, lanzar tu proceso, y almacenarte los resultados donde le hayas dicho.
Un saludo,
Migue