Instalación Apache Hadoop (Pseudo Distribuido)

Después de algo de teoría sigue la práctica.

Como primer componente instalaremos al hijo pródigo de Apache Fundation en cuanto a distribución se refiere, el componente más importante y la base de toda esta tecnología.



Pre-requisitos:

  • Apache Hadoop.
  • Máquina Física o Virtual con cualquier distribución de linux (RedHat ó Debian).
  • Conocimientos de Linux.
  • JDK
  • SSH
Primero procederemos a descargar el binario de este componente en el siguiente link: http://hadoop.apache.org/releases.html, para esta práctica utilizaré la versión 2.8.0 de Hadoop la más nueva hasta el momento liberada por la Fundación Apache.



Para esta instalación cuento con una máquina virtual con CentOS 7 instalado. No es necesario tener la GUI instalada en nuestra distribución, pero para fines prácticos la instalé.


Así que los pasos a continuación serán para un kernel RedHat y repositorios yum, esto puede hacer en una plataforma Debian y repositorios apt-get.

Comencemos:

Deberemos tener en nuestro sistema linux el siguiente paquete si es que decidieron descargar el binario de Apache Hadoop (hadoop-2.8.0.tar.gz) con el que trabajaré en este tutorial, de lo contrario deberían tener un paquete hadoop-2.x.x.tar.gz en su lugar. Procederemos por desempaquetar el binario.

tar -xzvf hadoop-2.8.0.tar.gz


por costumbre yo suelo mover la carpeta hadoop-2.8.0 a /user/local renombrandola como hadoop, que es el lugar del file system de linux para programas de los usuarios en este caso el mio (cluster).


en /usr/local/hadoop/etc/hadoop/ encontramos todos los archivos de configuración necesarios para que la herramienta de hadoop sea configurada, moveremos estos archivos a una carpeta llamada conf y ahora nuestros archivos de configuración estarían dentro de la siguiente estructura de carpetas /usr/local/hadoop/etc/hadoop/conf/.

Como logramos esto:



  1.  cd /usr/local/hadoop/etc/
  2.  mkdir conf
  3.  mv hadoop/* conf/
  4.  mv conf/ hadoop/


















Una vez realizado los pasos anteriores en /usr/local/hadoop/etc/hadoop/conf/ encontraremos varios archivos de configuración, en esta instalación básica nos concentraremos en tres archivos importantes y fundamentales para esta primera instalación "core-site.xml, hdfs-site.xml y salves"



Comenzaremos por configurar el archivo core-site.xml para este ejemplo configuraré solo dos propiedades de todas las que provee Apache para este archivo, para más información acerca de las propiedades de este archivo en el siguiente link: https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/core-default.xml.

Las dos propiedades principales para levantar un clúster standalone son:
  • hadoop.tmp.dir: Es la ruta temporal donde se guardará la información cuando el namenode es formateado, inmediatamente después de darle formato al namenode en esta dirección aparecerá la configuración correspondiente al namenode, lo mismo hace para el datanode y el secondary namenode, cuando tenemos un clúster no standalone, esta estructura de carpetas debe existir en todos los nodos.
  • fs.default.name: Es el nombre por default de nuestro File System, con este nombre podremos hacerle peticiones para recibir y guardar información en HDFS esta propiedad aunque aún funciona en su lugar deberíamos usar fs.defaultFS.



El siguiente archivo es hdfs-site.xml para este ejemplo solo se configurarán 4 propiedades de todas las que provee Apache para este archivo, para más información acerca de las propiedades de este archivo en el siguiente link: https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml.
  • dfs.replication: El número de veces que los bloques se replicarán en el clúster.
  • dfs.namenode.name.dir: Determina en que parte del file system local el namenode debería guardar el nombre de la tabla (fsimage) regresar a la teoría para ver el funcionamiento del fsimage.
  • dfs.datanode.data.dir: Determina en que parte del file system local el datanode debería guardar sus bloques. 
  • dfs.namenode.secondary.http-address: Determina el host y el puerto en el que el SecondaryNameNode estará escuchando.




Nuestro tercer archivo el siguiente archivo es slaves para este ejemplo solo se le dejara el valor por defecto (localhost) en este archivo se agregan todos los hostnames de las computadoras que tendrán el rol de datanodes.


Ahora configuraremos las variables de ambiente necesarias para que nuestro hadoop pueda levantar, aunque agregue varias variables, solo explicaré las que utilizaremos en este ejemplo, el lugar donde se debe agregar estas lineas es en el siguiente, loggeados como usuarios normales editamos con cualquier editor de texto el archivo .bashrc que le pertenece al usuario con el que estamos loggeado, una forma de acceder a el de forma rápida desde donde estamos es con la siguiente expresión.

~/.bashrc

Al final del archivo agregaremos estas lineas desde el apartado de Hadoop hasta el final, guardamos el archivo.


  • HADOOP_INSTALL: El Path al directorio principal donde se encuentran los binarios y archivos de configuración de hadoop.
  • HADOOP_CONF_DIR: El Path al directorio donde se encuentran los archivos de configuración de hadoop.
  • HADOOP_COMMON_LIB_NATIVE_DIR: El Path esta variable usa los binarios de acuerdo a la distribución que le indiquemos, por default los binarios que proporciona la página de Apache Hadoop están compilados para un sistema de 32 bits en un futuro veremos como compilarlos para 64 bits.
  • HADOOP_OPTS: Variable para definir propiedades como la memoria que debe utilizar en  la jvm, librerías externas extra o las mismas librerías de hadoop.
  • JAVA_HOME: El Path al directorio principal donde se encuentra instalado nuestro java (jdk).




Una vez que esto se realiza aplicamos los cambios con el comando source ~/.bashrc. Después de este último paso deberíamos ser capaces de ver la siguientes variables de ambiente.


Y por último el archivo hadoop-env.sh este contiene todas las variables de ambiente que hadoop utiliza para levantarse, este archivo solo se configurará si configuramos las variables de ambiente para que la sesión activa de la terminal sea la única que pueda ver las variables de ambiente en el sistema, entonces en este archivo deberemos agregar la ruta a nuestra instalación de java en la linea donde dice export JAVA_HOME=${JAVA_HOME} pero, si se siguió el paso anterior, no será necesario modificar este archivo y este paso debe ignorarse.



Una vez realizados los pasos anteriores, llego la hora de darle formato a nuestro namenode y eso se hace con el siguiente comando, desde cualquier parte de la consola.

hdfs namenode -format

Después de ejecutar el anterior comando, imprimirá una traza como la siguiente.






Una vez que termine, nos dirigimos a /usr/local/hadoop_store/hdfs/ y listamos los archivos que contiene este directorio; como podemos ver solo contiene una carpeta llamada namenode.

Antes de ejecutar el comando start-dfs.sh deberemos ejecutar algunos comando de ssh (secure shell) que nos evitaran estar introduciendo el password cada vez que queramos inicializar el servicio de hadoop y cada vez que lo queramos detener.

En una shell de linux nos posicionamos a la altura del usuario en el que instalamos hadoop, en mi caso se llama clúster, listamos los archivos y carpetas ocultas como vemos en la primera parte de la imagen, como podemos ver no hay ninguna carpeta llamada .shh a continuación ejecutamos los siguientes dos comandos para generar una llave con un algoritmo de encriptación del tipo RSA y copiarla a la computadora que queremos tener el acceso para que nos agregue en sus host conocidos y seamos capaces de ejecutar comandos desde un servidor remoto sin necesidad de autenticación en el sistema en este caso el local.

El siguiente comando nos sirve para generar la llave privada y publica para el método de autenticación en el secure shell:

  • ssh-keygen -t rsa -P "" (Nos habilitará un prompt para la introducción de una contraseña, en mi caso solo doy enter y generará un recuadrito con simbolos extraños, como el que vemos en la imagen).


Terminando de ejecutar el comando anterior veremos que en la carpeta .shh/ tenemos dos archivos, que prácticamente son la llave privada y publica generadas con el comando anterior.

Ahora para poder haber confianza entre dos computadoras, tenemos que copiar la llave pública a nuestra máquina que queremos entrar sin autenticación y eso lo hacemos con el siguiente comando.

  • ssh-copy-id usuario@hostname (En este caso mi usuario=cluster y el hostname=localhost).

Una vez que se ejecute el comando anterior, dos archivos más nos aparecerán en la carpeta .ssh/ el archivo de authorized_keys y known_hosts que no explicaré por que sus nombres son muy explícitos.
Después del comando anterior procedemos a probar la conexión, si los pasos anteriores fueron realizados satisfactoriamente, podemos probar con el siguiente comando.
  • ssh usuario@hostname
El prompt del comando no debería pedirte contraseña y debería salir algo parecido a lo del recuadro naranja, si así es, significa que estamos loggeados dentro de otra terminal remota. Para salir de esta terminal basta con escribir el comando exit.

Una vez fuera de esta terminal remota, procedemos a realizar el paso siguiente.


Después procederemos a iniciar el servicio de hadoop con el siguiente comando start-dfs.sh terminando de ejecutarse el anterior comando, en la ruta /usr/local/hadoop_store/hdfs/ encontraremos dos carpetas extras que en el paso anterior, una llamada datanode y dfs.

Con el comando jps nos lista todos los procesos de java activos, deberíamos poder ver los sisguentes:


  1. DataNode
  2. NameNode
  3. SecondaryNameNode

Como se muestra en la imagen siguiente:


Si todo va bien hasta este paso, deberíamos tener los siguientes puertos casi iguales como en la siguiente imagen.


El host y puerto encerrado en el recuadro rojo es el de la propiedad del core-site.xml (fs.default.name) e inmediatamente el de abajo, le pertenece al SecondaryNameNode propiedad del archivo hdfs-site.xml (dfs.namenode.secondary.https-address). Bueno y ahora podemos entrar a la Interfaz Gráfica Web que provee hadoop en el puerto 50070 por default.

Abrimos el explorador con el comando firefox y en la barra de busqueda introducimos, http://localhost:50070/ y deberímos ver algo como lo siguiente.




Comentarios

  1. Hay algo que no me queda claro ¿Estas montando un cluster, lo estas instalando de manera local o estas instalando en modo pseudo distribuido (simulando un cluster)?

    Pd: Armate un tutorial de flume para hacer stream data desde twitter o algo así

    ResponderBorrar
    Respuestas
    1. Es modo pseudo distribuido, pero si en lugar de usar localhost como hostname utilizas un hostname con una ip no local ó con FQHN y tienes al menos dos máquinas, puedes seguir los mismos pasos para montar un clúster con dos máquinas, pero por cuestiones de tiempo y de trabajo, no lo hice con 3 nodos, pero si quieres saber como, te puedo asesorar, por otro lado, esa es la idea, pienso escribir teoría, instalación y manejo de la mayoría de los componentes que puse en mi post "Componentes Apache Software Fundation", también cabe aclarar que esto que estoy explicando es de inicios de esta tecnología, hoy en día es menos doloroso montar un clúster con un Cluster Manager, que será de mis últimos temas en postear, ya que creo conveniente que para saber usar estas herramientas, se necesita saber todo acerca de ellas, el de flume esperalo pronto, tal vez unos meses, pero si te urge ps ponte en contacto y te asesoro, el siguiente post será acerca de YARN y ahí inauguraré una nueva pestaña la de Código con Java como lenguaje de Programación.

      Borrar

Publicar un comentario

Entradas más populares de este blog

Replicación y Formas de Paralelización Apache Hadoop

Manejo Apache Hive

Asignación de un líder Zookeeper