SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 13 de julio de 2009

Apache Hadoop - Qué es y para qué sirve

Introducción

Llevo un tiempo investigando y analizando la información disponible sobre Hadoop en Internet y he decidido crear un Post (después de mucho tiempo) para intentar aclarar: Qué es, Para qué sirve y Quién debe usarlo.

Espero poder responder a estas preguntas de la forma más sencilla posible (siempre entendiendo que si estás aquí es porque eres técnico ;) )

Qué es Hadoop

Dentro de la Web de Hadoop encontramos la definición de Hadoop como:

“Apache Hadoop Core is a software platform that lets one easily write and run applications that process vast amounts of data”
“Apache Hadoop Core es una plataforma de software que permite el desarrollo y ejecución de aplicaciones que procesan ingentes cantidades de datos”

Es decir, Hadoop es un Framework para el desarrollo de aplicaciones de procesamiento paralelo utilizando MaReduce, por lo tanto, Hadoop en sí “no es nada”

Qué es MapReduce?

MapReduce es un framework diseñado por Google para solucionar los problemas de procesamiento que tenían en sus aplicaciones más críticas (Buscador, Maps, Gmail, etc. )

No voy a entrar en detalle de cuál es el funcionamiento de MapReduce, puedes la documentación del análisis aquí simplemente haré un pequeño resumen (obtenido de Wikipedia, Hadoop y Google)

“La idea principal de MapReduce consiste en dividir los datos en un conjunto Map(clave, valor), y posteriormente aplicar Reduce sobre todos los Map(clave, valor) creados."

En términos UNIX se puede escribir como: $cat|map|sort|reduce

Para qué sirve Hadoop y cómo puedo aplicarlo en mi estructura?

La verdad es que es una pregunta que he tardado en responderme yo mismo. En principio todos nos sentimos “atraídos” por una nueva forma de ejecución paralela (nos entra la necesidad de aplicarlo a todo software a nuestro alcance ... :) ), sin embargo, la casuística que resuelve MapReduce no es aplicable a todo, para ello tiene que darse una condición muy simple: “El volumen de datos a procesar sea muy muy elevado”

Por ejemplo, si necesitamos saber cuántas peticiones ha hecho cada IP a nuestro “index.html”, puede ser una aplicación Hadoop o No, en función de cuál sea el volumen y la arquitectura de nuestros servidores, me explico con un ejemplo.


Tenemos como arquitectura Web la siguiente:

Para ello, podemos utilizar unos “simples” comandos de la shell para hacerlo. He modificado la dirección IP origen para que los tres últimos valores, siempre sean “0”


$ time cat /opt/www/squid-2.7/var/logs/access.log | grep "/AssistedSearch/index.html" |awk '{print $1" "$7}'|uniq -c
2 79.0.0.0 http://search.sfchildren.com/AssistedSearch/index.html
1 80.0.0.0 http://search.sfchildren.com/AssistedSearch/index.html
1 80.0.0.0 http://search.sfchildren.com/AssistedSearch/index.html
1 80.0.0.0 http://search.sfchildren.com/AssistedSearch/index.html
7102 10.0.0.0 http://search.sfchildren.com/AssistedSearch/index.html
..............

real 1m10.191s
user 1m13.253s
sys 0m6.940s

$ time cat /opt/www/squid-2.7/var/logs/access.log |wc -l 4636356
real 0m23.575s
user 0m19.087s
sys 0m6.568s

Como podemos ver, hemos contado las veces que cada IP ha realizado la llamada a nuestro “Index.html” utilizando simplemente shell (hay que decir que esto no cuenta de una forma optimizada ya distinguimos entre mayúsculas y minúsculas y los parámetros se computan, deberíamos optimizar el comando, pero a modo de ejemplo nos sirve), vemos que para procesar 4.636.356 registros le ha llevado 1' 10'', teniendo en cuenta que el archivo de log es de 666Mb (es totalmente fortuito :/ )

Nuestro requisito principal para poder utilizar de forma óptima Hadoop es que existe una cantidad de datos muy elevada a procesar, y 600Mb, no lo es. Así que hemos creado un archivo de 2Gb para volver a repetir el mismo comando.

Ahora los resultados han sido de 3' 46'' para contar el número de registros (un total de 18.545.467) y de 6' 39'' para el uniq -c.

Hombre, no es un tiempo “excesivo”, sin embargo, debemos tener en cuenta que sólo hemos buscado por una única dirección, si queremos hacer esto para varias URL llevaría un tiempo considerable, y si además añadimos el hecho de que sólo hemos consultado el Log de un único servidor ... qué pasaría si tuviésemos la siguiente estructura:


Aquí la cosa se complica ... pero no por dificultad, sino por Tiempo de procesamiento.


Conclusiones Iniciales

Hadoop es un Framework muy potente y realmente sencillo de utilizar, sin embargo, debemos tener muy claro Cuál es la problemática que resuelve y no intentar resolver todos nuestros problemas con él.

Para ello, debemos analizar si el problema a resolver cumple con los principios de:

WriteOne, ReadMany” Escribir una vez, Leer muchas

Vast Amount Data” Cantidad Ingente de datos (TB, PB)

Si nuestro problema no cumple con estas condiciones, entonces no estamos hablando de una aplicación Hadoop “pura” y el problema ha de resolverse utilizando otro “tipo de tecnología de Cluster”.

Espero haber puesto algo de "luz" en el oscuro mundo de Hadoop y en los próximos posts hablaremos de la instalación sobre Sun Solaris 10 y nuestros primeros pasos.

UPDATED: Cómo Instalar Hadoop sobre Solaris 10

6 comentarios:

  1. Quería aclarar el comentario

    "Es decir, Hadoop es un Framework para el desarrollo de aplicaciones de procesamiento paralelo utilizando MaReduce, por lo tanto, Hadoop en sí “no es nada”"

    En definitiva, lo que quiero transmitir es que, al igual que sucede con otros frameworks, en sí no aportan nada sino se desarrolla sobre ellos, me explico.

    Si yo "copio" los Jars de Structs sobre mi aplicativo web, no hacen nada, no sirven para nada. Sin embargo, si desarrollo mi aplicativo utilizando la arquitectura de Structs entonces si que me sirve. Con Hadoop sucede lo mismo. Simplemente Instalando Hadoop no puedo aprovechar las funcionalidades que me da, ahora bien, si desarrollo sobre él es cuando realmente puedo aprovecharlo.

    Espero haber aclarado las dudas.

    ResponderEliminar
  2. Muy util para decidirse o no, si estudiar este framework en favor de otros!

    ResponderEliminar
  3. seria bueno un post para instalasion de hadoop en windows

    ResponderEliminar
  4. Hola Anónimo,

    Lo cierto es que ... en Windows no tengo ni idea! No es mi sistema operativo ;) pero si alguien se anima ... con mucho gusto lo publicaré

    Un Saludo,
    Urko

    ResponderEliminar
  5. Excelente Post, Hadoop para procesamiento en paralelo.

    ResponderEliminar