Cómo instalar Hadoop en Windows Subsystem for Linux
La siguiente guía de instalación te permitirá instalar y configurar Hadoop 3.3.1 en Windows Subsystem for Linux o también llamado Subsistema de Windows para Linux.
Contenido
- Habilitar Windows Subsystem for Linux
- Instalar Ubuntu en Windows
- Instalar OpenJDK
- Configurar SSH
- Instalar OpenSSH
- Crear un nuevo usuario
- Habilitar la conexión SSH sin contraseña para el nuevo usuario - Descargar e instalar Hadoop
- Configuración de Hadoop en un solo nodo
- Configuración de las variables de entorno de Hadoop (bashrc)
- Editar el archivo hadoop-env.sh
- Editar el archivo core-site.xml
- Editar el archivo hdfs-site.xml
- Editar el archivo mapred-site.xml
- Editar el archivo yarn-site.xml
- Dar formato HDFS al NameNode - Iniciar cluster
- Accedemos a la interfaz de Hadoop en el navegador - Probando Hadoop y MapReduce con WordCount
- Descargar script MapReduce
- Creación de directorios
- Ejecutar WordCount del script de MapReduce
- Resultados del WordCount - Finalizar los procesos de Hadoop
Habilitar Windows Subsystem for Linux
Para habilitar WSL en Windows 10, sigue los siguientes pasos:
- Abrir Configuración
- Ir a Aplicaciones
- Ir a Programas y Características
- Ir a Activar o desactivar las características de Windows
- Seleccionar la casilla de Subsistema de Windows para Linux
- Aceptar y Reiniciar ahora
Instalar Ubuntu en Windows
Una vez que WSL esté habilitado, puedes utilizar diferentes distribuciones de Linux en Windows. En este caso instalaremos Ubuntu.
Para instalar una distribución de Linux en Windows 10, sigue los siguientes pasos:
- Abrir Microsoft Store
- Buscar la distribución de Linux a instalar, en este caso Ubuntu
- Le damos en Obtener
- Una vez instalado, le damos en Abrir
Si todo ha salido correctamente, nos pedirá un nombre de usuario y contraseña para usar en Linux. Este puede ser distinto al de Windows.
Instalar OpenJDK
Para utilizar Hadoop se requiere tener instalado Java Runtime Environment (JRE) y Java Development Kit (JDK).
Actualizaremos el sistema antes de iniciar una nueva instalación con el siguiente comando:
sudo apt update
La versión de Hadoop 3.3.1 soporta Java 8. El paquete de OpenJDK contiene tanto JRE como JDK.
Utilizamos el siguiente comando para instalar OpenJDK 8:
sudo apt install openjdk-8-jdk -y
Una vez terminado el proceso de instalación, verificamos la versión actual de Java:
java -version; javac -version
Obtendremos la versión de Java que está en uso. En esta caso, la versión 1.8.0_312.
Configurar SSH
Es recomendable utilizar un usuario distinto y sin privilegios root al usar Hadoop para mejorar la seguridad y administrar tu cluster de manera más eficiente. Aún así, puedes utilizar tu usuario root si lo deseas, solo nos saltamos el paso de crear un usuario nuevo. Para asegurar un buen funcionamiento de los servicios de Hadoop, el usuario debería poder establecer una conexión SSH sin contraseña con el localhost.
Instalar OpenSSH
Para instalar el cliente y servidor OpenSSH utilizaremos el siguiente comando:
sudo apt install openssh-server openssh-client -y
En mi caso, obtengo un mensaje diciendo que ya tengo instalada la última versión.
Crear un nuevo usuario
Utilizaremos el comando adduser para crear un nuevo usuario:
sudo adduser hdoop
En este ejemplo, el nombre de usuario es hdoop. Puedes utilizar cualquier nombre de usuario y contraseña que prefieras.
Antes de cambiar de usuario habilitemos OpenSSH:
sudo service ssh start
Ahora, iniciemos sesión con el usuario creado:
su - hdoop
Una vez que cambiemos de usuario, tenemos que habilitar la conexión SSH sin contraseña.
Habilitar la conexión SSH sin contraseña para el nuevo usuario
Generamos las claves SSH y definimos dónde se almacenarán:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
En mi caso, ya están creadas.
Utilizaremos el comando cat para guardar la llave pública en authorized_keys:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
Estableceremos los permisos para el usuario con el comando chmod:
chmod 0600 ~/.ssh/authorized_keys
Ahora verificamos que todo salió bien con el siguiente comando:
ssh localhost
Después de terminar estos pasos, el usuario nuevo debe ser capaz de establecer una conexión SSH al localhost sin problemas y sin necesidad de contraseña.
Descargar e instalar Hadoop
Vamos a la página oficial de Apache Hadoop y seleccionamos la versión que queremos instalar.
Una vez que vayamos al enlace de la versión que queremos, nos encontraremos un enlace para descargar el paquete tar de Hadoop.
Usaremos el enlace para descargar el paquete con el comando wget:
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
Una vez finalizada la descarga, extraemos los archivos para iniciar la instalación:
tar xzf hadoop-3.3.1.tar.gz
Los archivos se guardarán en una carpeta llamada hadoop-3.3.1.
Configuración de Hadoop en un solo nodo
Usualmente, Hadoop se utiliza con múltiples nodos en un cluster con varios servidores de redes, sin embargo, para explorar los comandos básicos y probar aplicaciones podemos configurar Hadoop en un solo nodo. Así cada servicio de Hadoop se ejecutará en un solo proceso de Java.
A continuación editaremos los siguientes archivos de configuración:
- bashrc
- hadoop-env.sh
- core-site.xml
- hdfs-site.xml
- mapred-site-xml
- yarn-site.xml
Configuración de las variables de entorno de Hadoop (bashrc)
Editaremos el archivo de configuración .bashrc usando un editor de texto como nano:
nano .bashrc
Definimos las variables de entorno de Hadoop agregando lo siguiente al final del archivo de configuración:
#Hadoop Related Options
export HADOOP_HOME=/home/hdoop/hadoop-3.3.1
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_OPTS"-Djava.library.path=$HADOOP_HOME/lib/native"
Una vez que agregamos las variables debemos guardar y salir del archivo.
Ahora aplicamos los cambios al entorno en ejecución con el siguiente comando:
source ~/.bashrc
Editar el archivo hadoop-env.sh
Para configurar YARN, HDFS, MapReduce entre otros ajustes de proyectos en Hadoop se usa el archivo hadoop-env.sh.
Para configurar un cluster de un solo nodo se debe definir que implementación de Java se va a usar.
Para encontrar dónde está localizado Java utilizamos el siguiente comando:
which javac
Ahora, usamos el directorio que obtuvimos para localizar OpenJDK:
readlink -f /usr/bin/javac
Ahora sabemos que OpenJDK está localizado en /usr/lib/jvm/java-8-openjdk-amd64, copiamos la dirección justo antes de /bin/javac.
Vamos a acceder al archivo hadoop-env.sh con la variable $HADOOP_HOME que recién creamos:
nano $HADOOP_HOME/etc/hadoop/hadoop-env.sh
Borramos el # de la variable $JAVA_HOME y agregamos el directorio completo a la instalación de OpenJDK:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
Editar el archivo core-site.xml
Las propiedades de HDFS y el núcleo de Hadoop están definidas en core-site.xml.
Para configurar Hadoop en un solo nodo se debe especificar la url para tu NameNode y un directorio temporal que Hadoop usa para el proceso map-reduce.
Accedemos al archivo core-site.xml:
nano $HADOOP_HOME/etc/hadoop/core-site.xml
Agregamos la siguiente configuración para anular los valores por default del directorio temporal y remplazar el url de nuestro HDFS por defecto:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hdoop/tmpdata</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://127.0.0.1:9000</value>
</property>
</configuration>
Recuerda que los valores deben concordar con los de tu sistema.
También debemos crear el directorio para los datos temporales si no existen:
mkdir /home/hdoop/tmpdata
Editar el archivo hdfs-site.xml
La ubicación de almacenamiento de metadatos del nodo, el archivo fsimage y el archivo de registro de edición son propiedades definidas en hdfs-site.xml.
Accedemos al archivo hdfs-site.xml:
nano $HADOOP_HOME/etc/hadoop/hdfs-site.xml
Agregamos la siguiente configuración de directorios al archivo según se encuentren localizados en nuestro sistema, además cambiamos el valor por default de dfs.replication a 1 para que concuerde con la configuración de un solo nodo:
<configuration>
<property>
<name>dfs.data.dir</name>
<value>/home/hdoop/dfsdata/namenode</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hdoop/dfsdata/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
Si es necesario, se crean los directorios definidos en dfs.data.dir utilizando el comando mkdir.
Editar el archivo mapred-site.xml
Usaremos el siguiente comando para acceder al archivo mapred-site.xml y definir los valores de MapReduce:
nano $HADOOP_HOME/etc/hadoop/mapred-site.xml
Agregamos la siguiente configuración para cambiar el nombre por default del framework MapReduce a yarn:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Editar el archivo yarn-site.xml
La definición de ajustes relevantes a YARN se encuentra en yarn-site.xml. Contiene información para los Node Manager, Resource Manager, Containers y Application Master.
Accedemos al archivo yarn-site.xml:
nano $HADOOP_HOME/etc/hadoop/yarn-site.xml
Agregamos la siguiente configuración al archivo:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>127.0.0.1</value>
</property>
<property>
<name>yarn.acl.enable</name>
<value>0</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PERPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
Dar formato HDFS al NameNode
Antes de iniciar los servicios de Hadoop por primera vez, debemos darle formato al NameNode:
hdfs namenode -format
Una vez que aparezca la notificación SHUTDOWN_MSG: Shutting down NameNode… significa que el proceso de formato finalizó.
Iniciar cluster
Navegamos al directorio sbin de Hadoop para iniciar el NameNode y DataNode.
cd /home/hdoop/hadoop-3.3.1/sbin./start-dfs.sh
Una vez que se ejecuten, iniciamos el Resource Manager y Node Managers:
./start-yarn.sh
Verificamos que todos los procesos se estén ejecutando con el siguiente comando:
jps
Accedemos a la interfaz de Hadoop en el navegador
Con el navegador de tu preferencia navegamos a tu localhost. Por default, el puerto 9870 te da acceso a la interfaz del NameNode:
http://localhost:9870
El puerto por default para acceder a los DataNodes es 9864:
http://localhost:9864
Para el siguiente ejemplo práctico, salimos de los archivos de hadoop a home con el siguiente comando:
cd
Probando Hadoop y MapReduce con WordCount
Ahora que hemos instalado Hadoop en un solo nodo, pobraremos su funcionalidad con un ejemplo práctico, contando la frecuencia de palabras en un texto.
Descargar script MapReduce
Para descargar el script que necesitamos vamos al repositorio de ejemplos de MapReduce y buscamos nuestra versión de Hadoop.
Una vez dentro del directorio correspondiente a nuestra versión, guardamos el enlace del archivo hadoop-mapreduce-examples-x.x.x-sources.jar.
Ahora lo descargamos utilizando comando wget:
wget https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-mapreduce-examples/3.3.1/hadoop-mapreduce-examples-3.3.1-sources.jar
También es necesario que tengas descargado o creado un texto con formato .txt para este ejemplo. En mi caso utilizaré un texto limpio de La Metamorfosis, novela de Franz Kafka obtenida de linguabooster.com.
Creación de directorios
Para poder ejecutar comandos en nuestro sistema de archivos HDFS utilizaremos la siguiente estructura:
hdfs dfs -"comando"
Primero vamos a listar los directorios y archivos que se encuentran en la raíz de nuestro sistema de archivos utilizando:
hdfs dfs -ls /
Ahora, debemos crear un directorio con nuestro nombre de usuario para posteriormente almacenar la entrada y salida del script de mapreduce:
hdfs dfs -mkdir -p /user/hdoop
Para almacenar la entrada del script, creamos el directorio input:
hdfs dfs -mkdir /user/hdoop/input
Ahora copiaremos el texto que obtuvimos anteriormente a nuestro sistema de archivos en la carpeta input que acabamos de crear:
hdfs dfs -put texto.txt /user/hdoop/input
Podemos verificar que copiamos el archivo utilizando ls de la siguiente manera:
hdfs dfs -ls /user/hdoop/input
Ejecutar WordCount del script de MapReduce
Llegó la hora de utilizar WordCount mejor conocido como el “Hola mundo” de Hadoop y MapReduce, ahora que tenemos todos los archivos y directorios listos, ejecutamos el script de la siguiente manera:
hadoop jar hadoop-mapreduce-examples-3.3.1-sources.jar org.apache.hadoop.examples.WordCount input output
En unos instantes, el script termina de ejecutarse con los resultados obtenidos de cualquier archivo colocado en el directorio de entrada input para almacenarlos en el directorio de salida output que este mismo crea.
Resultados del WordCount
Ahora puedes imprimir en pantalla los resultados obtenidos mediante el script de MapReduce con el siguiente comando:
hdfs dfs -cat /user/hdoop/output/*
Para obtener los resultados en un archivo .txt podemos ejecutar el siguiente comando:
hdfs dfs -cat /user/hdoop/output/* > /home/hdoop/resultados.txt
Finalizar los procesos de Hadoop
Una vez que termines de utilizar Hadoop es importante finalizar los procesos para eliminar archivos temporales y evitar cualquier pérdida de datos.
Para esto vamos a la carpeta donde se encuentran los archivos de Hadoop:
cd /home/hdoop/hadoop-3.3.1/sbin
Y ahora finalizamos los procesos con los siguienes comandos:
./stop-yarn.sh
./stop-dfs.sh
Para cerciorarnos de que han finalizado correctamente, podemos utilizar el siguiente comando:
Y así nos damos cuenta de que ya no se están ejecutando.
¡Ahora ya tienes configurado Hadoop en un solo nodo y lo has probado exitosamente! Es un excelente comienzo para seguir explorando comandos HDFS y ganar experiencia para diseñar un cluster con más nodos.
Te dejo una nube de palabras para ilustrar los resultados del WordCount realizado anteriormente. ¡Muchas gracias por leer!