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!

--

--