A continuación vamos a ver qué es Apache Hadoop y los pasos necesarios para instalar Apache Hadoop en una máquina con sistema operativo Ubuntu Linux. Apache Hadoop es un framework de software que soporta aplicaciones distribuidas. Permite desarrollar aplicaciones que tengan que trabajar con miles de nodos y petabytes (Mil Terabytes o un millón de Gigabytes) de datos.
Está desarrollado con el lenguaje de programación Java y está inspirado en documentos Google para MapReduce y el sitema de archivos de Google (GFS – Google File System).
Hadoop consiste básicamente en el paquete Hadoop Common, que contiene los archivos y scripts necesarios para hacer que Hadoop funcione.
Utiliza Hadoop Distributed File System (HDFS), un sistema de archivos distribuido, escalable y portátil desarrollado para el framework Hadoop.
Para más información sobre Apache Hadoop, se puede visitar el siguiente enlace: Wikipedia. Para más información sobre cómo instalar Apache Hadoop se puede visitar la Pagina Oficial (en inglés).
A continuación se mostrarán los pasos que hay que seguir para instalar Apache Hadoop en una intalación de un «clúster» pseudo-distribuido en un sólo nodo con HDFS sobre una máquina con Ubuntu Linux.
Requisitos Previos
Puesto que está desarrollado en Java, para trabajar con él es necesario tener instalado Java JDK (como mínimo, la versión 1.5), así como tener instalado ssh.
Instalar Java JDK
Como paso previo necesita que esté instalado el JDK de Java (versión 1.5 o más) para funcionar. En caso de no tenerlo instalado en el equipo, se puede instalar el JDK de Java ejecutando los siguientes comandos.
sudo apt-get update
sudo apt-get install default-jdk
Esto instalará la última versión del JDK de Java disponible en el repositorio de aplicaciones de Ubuntu.
Para comprobar que se ha instalado correctamente y ver que versión se ha instalado, podemos ejecutar el siguiente comando.
java -version
Devuelve un mensaje por pantalla parecido a este:
java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)
Configurar el acceso SSH
Para realizar la gestión de los nodos, necesitaremos acceso ssh. Por ello, hay que hacer la configuración del acceso ssh antes de instalar Apache Hadoop.
En caso de no tener instalado ssh, bastará con ejecutar los siguientes comandos.
sudo apt-get update
sudo apt-get install ssh
Para configurar el acceso ssh del usuario hduser
a localhost
, lo primero que hay que hacer es conectarse al sistema como el usuario hduser
.
su - hduser
A continuación, hay que generar una clave SSH con contraseña vacía para el usuario hduser
.
ssh-keygen -t rsa -P ""
El sistema preguntará por la ruta y el nombre del fichero que contendrá la clave ssh, a lo que se le puede indicar: /home/hduser/.ssh/id_rsa
El hecho de crear la clave ssh sin contraseña es necesario para poder desbloquear la clave sin necesidad de interacción por parte de un usuario cada vez que se conecta a un nodo.
Una vez creada la clave ssh, hay que habilitar el acceso SSH a la máquina local utilizando dicha clave.
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
Para probar que se ha configurado correctamente el acceso SSH, nos conectaremos a la máquina local.
ssh localhost
En caso de haber algún problema en la conexión, se puede lanzar de nuevo el comando en modo debug para poder investigar el motivo por el que se produce el error.
ssh -vvv localhost
También conviene revisar la configuración del servidor SSH del fichero /etc/ssh/sshd_config
, especialmente la opción PubkeyAuthentication
(que debe tener el valor yes
) y AllowUsers
(Si está activa, añadir el usuario hduser
). Si se realizan cambios en el fichero, hay que recargar la configuración con el siguiente comando.
sudo /etc/init.d/ssh reload
Una vez que ya está todo bien configurado, y ha podido conectarse correctamente a localhost, puede volver a salir ejecutando el siguiente comando.
exit
Desactivar IPv6
Uno de los problemas de utilizar IPv6 en Ubuntu es que utilizando la dirección IP 0.0.0.0 en la configuración de varios Hadoop relacionados provoca que Hadoop mapee las direcciones IPv6. Como no es necesario tener esto activo a menos que esté conectado a una red IPv6, conviene desactivarlos antes de instalar Apache Hadoop.
Para desactivar IPv6 en Ubuntu Linux 14.04 LTS basta con abrir el fichero /etc/sysctl.conf
y añadir las siguientes líneas al final del fichero.
# disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Para que los cambios se apliquen, hay que reiniciar el sistema. Una vez reiniciado, se puede comprobar si se ha desactivado correctamente IPv6 ejecutando el siguiente comando.
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
Esto devuelve uno de estos valores: 0 si IPv6 está activo, o 1 si está desactivado.
Alternativa
Si solo queremos desactivar el uso de IPv6, podemos hacerlo añadiendo lo siguiente en el fichero /usr/local/hadoop/etc/hadoop/hadoop-env.sh
.
export HADOOP_OPTS=-Djava.net.preferIPv4Stack=true
Por defecto, esto suele venir ya configurado así al instalar Apache Hadoop versión 2.6.0.
Crear usuario para Hadoop
Lo primero que hay que hacer es crear un grupo de usuarios al que pertenecerá el usuario:
sudo addgroup hadoop
Crear usuario y asignarlo al grupo que se ha creado anteriormente.
sudo adduser --ingroup hadoop hduser
El sistema pedirá que se introduzcan algunos datos sobre el usuario así como una contraseña de acceso.
Añadir el usuario creado al grupo sudo
para que, al instalar Apache Hadoop, se pueda ejecutar aplicaciones en modo administrador.
sudo adduser hduser sudo
Instalar Apache Hadoop Common
Para descargar el paquete Apache Hadoop Common hay que entrar en la página oficial de Apache Hadoop (http://hadoop.apache.org/) y seleccionar la versión que se quiere descargar. En este caso, vamos a instalar Apache Hadoop 2.6.0, por lo que hay que descargar esta versión del paquete Apache Hadoop Common.
Desde el siguiente enlace se puede descargar el fichero: hadoop-2.6.0.tar.gz
Descomprimir el fichero tar
que hemos descargado. Para ello, ejecutar el siguiente comando desde un terminal:
tar -xzf hadoop-2.6.0.tar.gz
Una vez descomprimido, mover los archivos a su ubicación en /usr/local
:
sudo mv hadoop-2.6.0/ /usr/local
Ahora hay que crear un enlace simbólico a la carpeta que contiene los ficheros:
cd /usr/local/
sudo ln -s hadoop-2.6.0/ <nombre_directorio>
De esta forma se puede hacer referencia directamente a hadoop
sin necesidad de tener que hacer referencia a la versión que está utilizando.
whereis hadoop
Lo que devuelve un mensaje por pantalla parecido al siguiente.
hadoop: /usr/local/<nombre_directorio>
Faltaría establecer la variable de entorno HADOOP_HOME
:
export HADOOP_HOME=/usr/local/<nombre_directorio>
Cambiar el usuario propietario de los archivos de Hadoop Common instalados.
sudo chown -R hduser:hadoop /usr/local/hadoop-2.6.0
Configurar Apache Hadoop
Una vez instalado Apache Hadoop, sólo faltaría realizar la configuración. En esta sección vamos a ver los pasos necesarios para configurar Apache Hadoop para que funcione como un «clúster» de un sólo nodo. Para más información sobre cómo configurarlo se puede visitar la Apache Wiki (Inglés).
Lo primero que hay que hacer es ver si hemos hecho correctamente todos los pasos anteriores. Para ello basta con ejecutar el siguiente comando:
/usr/local/<nombre_directorio>/bin/hadoop version
Esto devuelve un mensaje por pantalla parecido a este:
Hadoop 2.6.0
...This command was run using /usr/local/hadoop-2.6.0/share/hadoop/common/hadoop-common-2.6.0.jar
A continuación hay que configurar el directorio donde Hadoop va a guardar los archivos de datos, para lo cual hay que crear primero un directorio.
mkdir /usr/local/<nombre_directorio>/data
Asignar al usuario hduser
como propietario de la carpeta.
sudo chown hduser:hadoop /usr/local/<nombre_directorio>/data
Para reforzar la seguridad de los datos, se pueden modificar los permisos de la carpeta.
sudo chmod 750 /usr/local/<nombre_directorio>/data
Si no se establecen bien los permisos el sistema nos devolverá un error cuando se intente formatear el nodo (java.io.IOException
).
Ahora hay que editar una serie de ficheros de configuración.
Editar el fichero $HADOOP_HOME/etc/<nombre_directorio>/hadoop-env.sh
:
Completar los valores de estas variables de entorno.
# set to the root of your Java installation
export JAVA_HOME=/usr/java/latest
# Assuming your installation directory is /usr/local/hadoop
export HADOOP_PREFIX=/usr/local/<nombre_directorio>
Editar el fichero $HADOOP_HOME/etc/<nombre_directorio>/core-site.xml
:
Insertar las siguientes líneas dentro de las etiquetas <configuration> </configuration>
.
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
<description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implementation.</description>
</property>
Editar el fichero $HADOOP_HOME/etc/<nombre_directorio>/hdfs-site.xml
:
Insertar las siguientes líneas entre las etiquetas <configuration> </configuration>
:
<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.</description>
</property>
Editar el fichero $HADOOP_HOME/etc/<nombre_directorio>/mapred-site.xml
:
Es muy posible que este fichero no exista, por lo que hay que crearlo haciendo una copia del fichero $HADOOP_HOME/etc/<nombre_directorio>/mapred-site.xml.template
.
Editar el fichero e insertar las siguientes líneas dentro de las etiquetas <configuration> </configuration>
.
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>localhost:54311</value>
<description>The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task.</description>
</property>
Editar el fichero $HADOOP_HOME/etc/<nombre_directorio>/yarn-site.xml
:
Insertar las siguientes líneas entre las etiquetas <configuration> </configuration>
:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
Para más información sobre cómo configurar estos ficheros se pueden visitar los siguientes enlaces: Docs (Inglés) y API (Inglés).
Actualizar $HOME/.bashrc
Añadir las siguientes líneas al final del fichero $HOME/.bashrc
para el usuario hduser
.
# Set Hadoop-related environment variables
export HADOOP_HOME=/usr/local/<nombre_directorio>
# Set JAVA_HOME (we will configure JAVA_HOME for Hadoop later on)
export JAVA_HOME=/usr/lib/jvm/default-java
# Some convenient aliases and functions for running Hadoop-related commands
unalias fs &> /dev/null
alias fs="hadoop fs"
unalias hls &> /dev/null
alias hls="fs -ls"
# If you have LZO compression enabled in your Hadoop «clúster» and
# compress job outputs with LZOP
# Conveniently inspect an LZOP compressed file from the command
# line; run via:
#
# $ lzohead /hdfs/path/to/lzop/compressed/file.lzo
#
# Requires installed 'lzop' command.
#
lzohead () {
hadoop fs -cat $1 | lzop -dc | head -1000 | less
}
# Add Hadoop bin/ directory to PATH
export PATH=$PATH:$HADOOP_HOME/bin
Si utiliza un shell diferente a bash
, tendrá que editar el fichero correspondiente para añadir estas líneas.
Hay que copiar estas líneas en el fichero .bashrc
de todos aquellos usuarios que vayan a utilizarlo.
Para aplicar los cambios, ejecutar este comando.
source ~/.bashrc
Formatear el sistema de archivos HDFS
Otra de las cosas que hay que hacer después de instalar Apache Hadoop es formatear el sistema de archivos del «clúster». Sólo hay que realizar el formateo la primera vez que se se configura el «clúster».
Para formatear el sistema de archivos, ejecutar el siguiente comando.
/usr/local/<nombre_directorio>/bin/hadoop namenode -format
Lo cual devuelve un mensaje por pantalla parecido a este:
14/12/07 20:13:14 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = Toshiba/127.0.1.1 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 2.6.0 STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20 -r 911707; compiled by 'chrisdo' on Fri Feb 19 08:07:34 UTC 2010 ************************************************************/ ... 14/12/07 20:13:18 INFO namenode.FSNamesystem: fsOwner=hduser,hadoop 14/12/07 20:13:18 INFO namenode.FSNamesystem: supergroup=supergroup 14/12/07 20:13:18 INFO namenode.FSNamesystem: isPermissionEnabled=true 14/12/07 20:13:19 INFO common.Storage: Image file of size 96 saved in 0 seconds. 14/12/07 20:13:19 INFO common.Storage: Storage directory .../hadoop-hduser/dfs/name has been successfully formatted. 14/12/07 20:13:19 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at ubuntu/127.0.1.1 ************************************************************/
Arrancar el «Clúster»
Para arrancar el «clúster» hay que seguir los siguientes pasos.
Lo primero que hay que hacer es arrancar el dfs (distributed file system), para lo cual basta con ejecutar el siguiente comando.
/usr/local/<nombre_directorio>/sbin/start-dfs.sh
Cuando nos pregunte si queremos continuar conectando al nodo, indicarle que sí (yes
).
A continuación, arrancar los yarn daemons. Para ello, ejecutar el siguiente comando.
/usr/local/<nombre_directorio>/sbin/start-yarn.sh
También se puede ejecutar solamente este comando, que realiza todas las operaciones necesarias para arrancar el «clúster».
/usr/local/<nombre_directorio>/sbin/start-all.sh
Para comprobar que se ha arrancado todo correctamente, se puede ejecutar el siguiente comando, que indicará los procesos de Hadoop que se están ejecutando.
jps
Esto devolverá un mensaje por pantalla parecido al siguiente.
3543 DataNode 4021 NodeManager 3903 ResourceManager 4318 Jps 3747 SecondaryNameNode 3432 NameNode
Con el comando netstat
se puede comprobar si Hadoop está escuchando en los puertos configurados.
sudo netstat -plten | grep java
- Interfaz web del NameNode:
http://localhost:50070/
- Interfaz web del DataNode:
http://localhost:50075/
- Interfaz web del SecondaryNameNode:
http://localhost:50090/
- Interfaz web del ResourceManager («Clúster»):
http://localhost:8088/
En caso de producirse algún error, se puede acceder a los ficheros de log que están ubicados en el directorio /logs/
.
Subir ficheros a HDFS
Si se quiere hacer una prueba de manejo de ficheros, se pueden ejecutar los siguientes comandos.
Crear un directorio HDFS
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/hduser
Copiar archivos en el sistema de ficheros distribuido
hdfs dfs -put <carpeta_local_origen> <carpeta_hdfs_destino>
Borrar un archivo del sistema de ficheros distribuido
hdfs dfs -rm <carpeta_hdfs>/<nombre_fichero>
Para conocer más comandos HDFS, puede visitar el siguiente enlace: HDFS Commands (Inglés).
Parar el «Clúster»
Para parar el «clúster» hay que seguir los siguientes pasos.
Lo primero que hay que hacer es parar el sistema de ficheros distribuido (dfs – distributed file system), para lo cual basta con ejecutar el siguiente comando.
/usr/local/<nombre_directorio>/sbin/stop-dfs.sh
A continuación, para parar los yarn daemons, ejecutar el siguiente comando.
/usr/local/<nombre_directorio>/sbin/stop-yarn.sh
También se puede ejecutar solamente este comando, que realiza todas las operaciones necesarias para parar el «clúster».
/usr/local/<nombre_directorio>/sbin/stop-all.sh
Para más información sobre cómo depurar programas MapReduce, puede visitar el siguiente enlace: Debug MapReduce Programs (Inglés).
Buen tutorial.
Muchas gracias! 😉
Casi tres a%os despues me sirvio, solo es tener en cuenta las nuevas versiones de java y hadoop. Por esfuerzos y publicaciones como estas es que se transmite el conocimiento. Gracias por compartir