Montando un laboratorio de big data basado en Hadoop 2

LLevamos ya un tiempo usando el llamado zoo de hadoop para hacer algunos proyectos relacionados con big-data. Hasta ahora siempre hemos usado la versión de hadoop 1.x porque era la versión con la que empezamos a hacer las pruebas de concepto. Pero como parece ya seguro que hadoop ha venido para quedarse no está de más hacer pruebas con las nuevas versiones. En concreto hemos montado un laboratorio de hadoop con última versión estable, que a día de hoy es la 2.5. La hemos montado para analizar las siguientes características:

 

A grandes rasgos tenemos, un laboratorio con 5 nodos (lug000.zylk.net, lug002.zylk.net, lug004.zylk.net, lug005.zylk.net, lug006.zylk.net) que está montado con ordenadores viejos de 32 bits y unas maquinas virtuales de 64 bits para hacerlo lo más heterogeneo posible. Estas 5 máquinas están conectadas por medio de una red de 1 GB, porque uno de los temas críticos entendemos que es la comunicación entre los nodos. En cada máquina descomprimimos la versión de hadoop 2.5.0 y configuramos los archivos necesarios (.sh de entorno y configuraciones generales mínimas http://hadoop.apache.org/docs/r2.5.0/hadoop-project-dist/hadoop-common/ClusterSetup.html). Una vez hemos hecho esto, y teniendo en cuenta que las llaves ssh las teníamos ya configuradas correctamente porque este laboratorio se ha usado para probar la versión 1.x podemos proceder a arrancar el culster.

Previamente a esto preparamos el namenode del hdfs.

>>>hadoop@lug000:/zoo/hadoop-2.5.0/bin$ ./hdfs namenode -format lug000.zylk.net
14/08/25 10:08:19 INFO common.Storage: Storage directory /zoo/data/namenode0 has been successfully formatted.
14/08/25 10:08:19 INFO common.Storage: Storage directory /zoo/data/namenode1 has been successfully formatted.
14/08/25 10:08:19 INFO common.Storage: Storage directory /zoo/data/namenode2 has been successfully formatted.

Y arrancamos el file system distribuido:

>>>hadoop@lug000:/zoo/hadoop-2.5.0/sbin$ ./start-dfs.sh
14/08/25 10:09:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [lug000.zylk.net]
lug000.zylk.net: starting namenode, logging to /zoo/hadoop-2.5.0/logs/hadoop-hadoop-namenode-lug000.out
lug002.zylk.net: starting datanode, logging to /zoo/hadoop-2.5.0/logs/hadoop-hadoop-datanode-lug002.out
lug004.zylk.net: starting datanode, logging to /zoo/hadoop-2.5.0/logs/hadoop-hadoop-datanode-lug004.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /zoo/hadoop-2.5.0/logs/hadoop-hadoop-secondarynamenode-lug000.out
14/08/25 10:09:58 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Habrá que revisar el warning ... aunque de momento no lo vamos a analizar. Podemos conectarnos ya a la consola del file system distribuido y ver el cluster (como estamos haciendo pruebas, de momento solo hemos usado tres nodos de los 5 disponibles)

 


Para ver que todo esta ok, vamos a subir un fichero al sistema

>>>hadoop@lug000:/zoo/hadoop-2.5.0/bin$ ./hdfs dfs -put /tmp/text.txt /text.txt
14/08/25 10:15:00 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Y podemos verlo desde la interfaz gráfica




Del filesystem distribuido nos interesa además la nueva característica relacionada con los atributos extras (http://mapredit.blogspot.com.es/2014/07/xattr-are-coming-to-hdfs.html, http://blog.cloudera.com/blog/2014/06/why-extended-attributes-are-coming-to-hdfs/) que en realidad permite asociar datos al fichero a modo de meta-datos simples.

Vamos a asignar al fichero un autor, para hacer la prueba.

>>>hadoop@lug000:/zoo/hadoop-2.5.0/bin$ ./hdfs dfs -setfattr -n 'user.author' -v 'zylk.net' /text.txt
14/08/25 10:21:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Una vez asignado podemos acceder a su valor de la siguiente manera

>>>hadoop@lug000:/zoo/hadoop-2.5.0/bin$ ./hdfs dfs -getfattr -d /text.txt
14/08/25 10:22:27 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
# file: /text.txt
user.author="zylk.net"

O directamente al valor del atributo

>>>hadoop@lug000:/zoo/hadoop-2.5.0/bin$ ./hdfs dfs -getfattr -n 'user.author' /text.txt
14/08/25 10:24:05 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
# file: /text.txt
user.author="zylk.net"


Una vez que hemos hecho las pruebas mínimas del file system distribuido vamos a probar el nuevo motor para map&reduce basado en yarn, la verdad es que el nuevo motor ha sufrido un cambio radical desde el punto de vista de arquitectura. Vamos a decir que yarn es un motor/framework para escribir aplicaciones distribuidas y un ejemplo de una de estas aplicaciones es Map&Reduce (http://es.slideshare.net/cloudera/introduction-to-yarn-and-mapreduce-2).


Lo primero arrancamos los procesos necesarios

>>>hadoop@lug000:/zoo/hadoop-2.5.0/sbin$ ./start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /zoo/hadoop-2.5.0/logs/yarn-hadoop-resourcemanager-lug000.out
lug004.zylk.net: starting nodemanager, logging to /zoo/hadoop-2.5.0/logs/yarn-hadoop-nodemanager-lug004.out
lug002.zylk.net: starting nodemanager, logging to /zoo/hadoop-2.5.0/logs/yarn-hadoop-nodemanager-lug002.out

Y vemos que disponemos de una nueva consola web para el seguimiento de la tareas que se van a ejecutar dentro de framework yarn

 





Con el proipo yarn viene con unos cuantos ejemplos de map&reduce. Vamos a ejecutar uno de ellos para ver que está todo correcto. En este caso vamos a calcular el valor de pi usando el método montercarlo (http://centros5.pntic.mec.es/ies.de.bullas/dp/matema/conocer/numpi_probabilidad.htm)

>>>hadoop@lug000:/zoo/hadoop-2.5.0/bin$ ./yarn jar ../share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar pi 16 10000
Number of Maps  = 16
Samples per Map = 10000
14/08/25 10:34:25 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
Wrote input for Map #5
Wrote input for Map #6
Wrote input for Map #7
Wrote input for Map #8
Wrote input for Map #9
Wrote input for Map #10
Wrote input for Map #11
Wrote input for Map #12
Wrote input for Map #13
Wrote input for Map #14
Wrote input for Map #15
Starting Job
14/08/25 10:34:29 INFO client.RMProxy: Connecting to ResourceManager at lug000.zylk.net/192.168.1.100:8032
14/08/25 10:34:30 INFO input.FileInputFormat: Total input paths to process : 16
14/08/25 10:34:30 INFO mapreduce.JobSubmitter: number of splits:16
14/08/25 10:34:30 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1408955506111_0001
14/08/25 10:34:31 INFO impl.YarnClientImpl: Submitted application application_1408955506111_0001
14/08/25 10:34:31 INFO mapreduce.Job: The url to track the job: http://lug000.zylk.net:8088/proxy/application_1408955506111_0001/
14/08/25 10:34:31 INFO mapreduce.Job: Running job: job_1408955506111_0001
14/08/25 10:34:50 INFO mapreduce.Job: Job job_1408955506111_0001 running in uber mode : false
14/08/25 10:34:50 INFO mapreduce.Job:  map 0% reduce 0%
14/08/25 10:35:17 INFO mapreduce.Job:  map 13% reduce 0%
14/08/25 10:35:18 INFO mapreduce.Job:  map 31% reduce 0%
14/08/25 10:35:19 INFO mapreduce.Job:  map 38% reduce 0%
14/08/25 10:35:22 INFO mapreduce.Job:  map 44% reduce 0%
[...]
    File Input Format Counters
        Bytes Read=1888
    File Output Format Counters
        Bytes Written=97
Job Finished in 65.688 seconds
Estimated value of Pi is 3.14127500000000000000


Con esto solo nos quedaría ver como funciona el gateway nfs.. que lo dejaremos para otro artículo. También montaremos hbase sobre hadoop-2, así como el resto de herramientas alineadas con el I+D+i de zylk.net, para poder aportar valor en la gestión documental y la inteligencia de negocio principalmente.
 

00

More Blog Entries

0 Comments