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:
- El
proxy/gateway NFS - Las nuevas interfaces gráficas
- El
concepto de atributo extendido - El
nuevo motor de Map&Reduce basado en Yarn
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 https://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 (https://mapredit.blogspot.com.es/2014/07/xattr-are-coming-to-hdfs.html,
https://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 (https://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 (https://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.