Paso 1. Configurando Hadoop en Linux (un clúster de una máquina)
En mi caso he usado la última versión estable de Hadoop del 1 de Agosto de 2013 y el Ubuntu. En concreto:
Linux Ubuntu 12.0.4 LTS
Os recomiendo este enlace http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/ donde se explica bastante bien como montarlo paso a paso. Aunque posiblemente os encontraréis con algunos problemas que paso a detallar a continuación:
- Que os de un rechazo de conexión en el puerto 22, es decir, "connect to host localhost port 22 connection refused". Esto quiere decir que probablemente, no tenéis descargado el ssh y el sshd o bien no se estén ejecutando. Para comprobar si existen, hacéis un "which ssh" y un "which sshd", si no devuelve una ruta, deberíais bajar el paquete e instalarlo (sudo apt-get install ssh).
- Si habéis seguido todas las instrucciones del enlace, es decir, habéis creado un usuario para hadoop, habéis descargado y configurado hadoop, habéis deshabilitado ipv6, disteis permisos al fichero /etc/hosts, ... llega el momento de levantar los procesos de Hadoop, para ello tenéis la opción de usar el .sh deprecado (/usr/local/hadoop/bin/start-all.sh) o bien en dos pasos, la opción recomendada actualmente por Hadoop:
/usr/local/hadoop/bin/start-dfs.sh (levanta los procesos NameNode, SecondaryNameNode y DataNode)
/usr/local/hadoop/bin/start-mapred.sh (levanta los procesos JobTracker y TaskTracker)
Una vez lanzados los servicios, con jps comprobamos que efectivamente están levantados. Al teclear jps debe saliros como mínimo algo de este estilo:
5113 TaskTracker
4507 DataNode
5239 Jps
4772 SecondaryNameNode
4245 NameNode
4873 JobTracker
Si tenéis Eclipse abierto u otros procesos Java lanzados, os saldrán también, pero no nos interesan (salvo que estén ocupando los puertos que teníamos reservados para Hadoop).
Si alguno de los procesos mencionados no os aparecen, pongo por aquí unas pequeñas ayudas. En general es recomendable lanzar uno a uno los que no aparezcan para obtener más información que a veces no se muestra en el log:
1) Si no aparece DataNode: lanzar "bin/hadoop datanode" y ver el error. Puede ser que necesitemos limpiar las carpetas tmp de hadoop "rm -Rf /app/tmp/hadoop-hduser/*" (no tiene porque estar sólo ahí) y "bin/hadoop namenode -format" con los servicios parados (stop-dfs.sh y stop-mapred.sh).
2) Si no aparece JobTracker: lanzar "bin/hadoop jobtracker" y ver el error. Si está relacionado con permisos/privilegios usar el comando "sudo chown -R hduser /usr/local/hadoop". Si después os da algo de este estilo: "org.apache.hadoop.mapred.SafeModeException: JobTracker is in safe mode", tendréis que salir del modo seguro "bin/hadoop dfsadmin -safemode leave"
Para ver los puertos asignados, podéis usar este comando: "sudo netstat -plten | grep java"
Si volvéis a levantar todo y veis los 6 con el comando "jps", perfecto, sino comentar por aquí el error por si me suena.
Paso2. Ejemplo con MapReduce
Para este ejemplo rapidillo, pero útil para ver cómo funciona (el concepto me recuerda bastante a los Reader/Processor/Writer de Spring-Batch ya que además la ejecución se paraleliza) usaremos:
- Un fichero con los terremotos de magnitud mayor o igual 1.5 que he obtenido a partir de fuentes oficiales, de unos 5Mb. Descargar.
- Una clase central que invocará a nuestras clases Map y Reduce. Descargar.
- La clase que se encarga del Map. Descargar
Colocamos nuestro fichero en el sistema de ficheros de Hadoop:
bin/hadoop dfs -put /home/hduser/terremotos terremotos
bin/hadoop dfs -ls /user/hduser/terremotos
Generaremos un jar (Desde eclipse podéis hacerlos fácilmente mediante la opción de exportar) con las clases mencionadas, y con los servicios de hadoop levantados, ejecutaremos el jar: "java -jar Terremotos.jar"
Y así obtenemos la lista de terremotos en Galicia a lo largo de la historia reciente:
hduser@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -cat /user/hduser/terremotosOutput/part-00000
Coruña 240
Costa gallega 252
Lugo 1276
OTROS 56518
Ourense 519
Pontevedra 249
Si queremos volver a lanzar el jar, podemos borrar el directorio de salida con "bin/hadoop dfs -rmr /user/hduser/terremotosOutput"
Para pasar el fichero del sistema de ficheros de hadoop al local, podéis hacer algo de este estilo: ./hadoop dfs -copyToLocal /user/hduser/terremotosOutput/part-00000 /home/hduser
Ayudda!!! al querer levantar un proceso me manda este mensaje "No such file or directory" y tambien me dice que el tiempo de conexion al puerto 22 esta agotada. que puedo hacer en estos casos. soy nueva en esto de hadoop
ResponderEliminar