1. Introducción

Buenas gente, en un tutorial que escribí no hace mucho, describí cómo configurar un cluster hadoop en modo pseudo distribuido, es decir, instalar en una misma máquina de prueba todos los componentes que conforman un cluster hadoop, a saber, NameNodes, DataNodes, TaskTrackers y JobTrackers. En el mundo real, estos componentes están distribuidos entre distintas máquinas pertenecientes a un cluster, es decir, en el mundo real, Hadoop se instala en modo distribuido que es de lo que va este tutorial.

Para realizar este tutorial, usaré las máquinas que tenemos de Amazon WS y el sistema operativo será Ubuntu 14.04 LTS. La versión de Hadoop será 2.6.0.

En mi humilde opinión, la mejor manera para instalar y configurar una instalación con lo necesario para un cluster hadoop es configurar docker o ansible para ejecutar las tareas necesarias para instalar en cada máquina lo que hicimos en el tutorial del modo pseudo distribuido, es decir, crear playbooks con instrucciones a ejecutar en cada uno de los nodos del cluster.

Este tutorial va de como usar la configuración pseudo cluster de nodo simple para pasar a tener un cluster multi nodo distribuido, en el que uno de los nodos actuará como el maestro (pero también haremos que actúe como esclavo pues queremos que este nodo pueda almacenar datos y procesarlos) y el otro nodo actuará como esclavo. La idea es acabar teniendo un playbook ansible o docker que nos permita tener automatizado esta tarea.

2. Prerrequisitos

Seguir los pasos del tutorial pseudo distribuido en cada una de las máquinas que conforman nuestro cluster, en este caso concreto, voy a considerar que tengo dos maquinas, maestro y esclavo, en los cuales, quiero que el maestro haga los papeles del NameNode, DataNode, JobTracker y TaskTracker, mientras que el esclavo hará los papeles de DataNode y TaskTracker. Es absolutamente recomendable que usemos la misma configuración de rutas y dependencias necesarias en cada una de las máquinas.

Asumo que vas a poner a las maquinas en el mismo subrango de red, es decir, el maestro tendrá una ip del estilo 192.168.0.1 y el esclavo 192.168.0.2.

Ya tienes dos máquinas en modo pseudo distribuido corriendo en el mismo subrango de red? podemos continuar con el tutorial…

3. Trabajo en red

Como es normal, cada máquina perteneciente al cluster debe ser capaz de hablar una con otra, para ello, lo más sencillo es poner ambas máquinas en la misma red con la misma configuración hardware y software, por ejemplo conectar ambas máquinas a través de un concentrador (hub) o un switch.

Para hacerlo simple, asignaré la ip 192.168.0.1 al maestro y la 2 al esclavo. Actualiza los ficheros /etc/hosts en ambas máquinas con estas líneas:

192.168.0.1    master

192.168.0.2    slave

4. Asegurar acceso SSH

El usuario hduser en el maestro (hduser@master) debe ser capaz de conectar a:

a) a su propia cuenta en la máquina maestro, es decir, poder conectar usando el comando ssh master.

b) a la cuenta hduser en la máquina esclavo (hduser@slave) sin necesidad de proporcionar el password.

Si te acuerdas de lo que hicimos en el primer tutorial, generamos una clave pública ssh de lo que sería el nodo maestro y lo copiamos en la carpeta donde el demonio sshd puede usarlo para verificar la identidad del cliente que se quiere conectar. Ahora necesitamos copiar la clave del nodo maestro, el cual debería ser $HOME/.ssh/id_rsa.pub, en cada uno de los nodos esclavos que queramos añadir a nuestro cluster, es decir, a la carpeta $HOME/.ssh/authorized_keys de cada uno de los esclavos. Para ello, puedes usar el siguiente comando:

hduser@master:~$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub hduser@slave

Este comando te preguntará el password del usuario hduser en la máquina esclavo, copiará la clave pública, creará el directorio que necesita y ajustará los permisos necesarios. El paso final es comprobar que todo va bien conectando con el usuario hduser desde el maestro a la cuenta de usuario hduser en la máquina esclavo.

(cuidado con esto porque no estoy al 100% seguro de que sea necesario, cuando puedas tener las máquinas reales donde confrontar este texto y hacer la revisión, podras comprobarlo. Creo que el comando ssh-copy que has lanzado desde el maestro basta para tener copiada la clave del esclavo en el maestro)

Atención, antes de lanzar el siguiente comando ssh-copy, intenta conectar desde el maestro al maestro, desde el maestro al esclavo y desde el esclavo al maestro. Si puedes, perfecto, no ejecutes estos comandos que vienen a continuación, en caso contrario, será necesario copiar la clave pública de cada uno de los nodos esclavos en el almacén de claves de la maquina o maquinas que hagan de maestro, para ello, debes lanzar este comando desde cada una de las máquinas esclavas del cluster:

hduser@slave:~$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub hduser@master

Conectando al maestro desde el maestro:

hduser@master:~$ ssh master

The authenticity of host ‘master (192.168.0.1)’ can’t be established.

RSA key fingerprint is 3b:21:b3:c0:21:5c:7c:54:2f:1e:2d:96:79:eb:7f:95.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added ‘master’ (RSA) to the list of known hosts.

hduser@master:~$

…y desde el maestro al esclavo:

hduser@master:~$ ssh slave

The authenticity of host ‘slave (192.168.0.2)’ can’t be established.

RSA key fingerprint is 74:d7:61:86:db:86:8f:31:90:9c:68:b0:13:88:52:72.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added ‘slave’ (RSA) to the list of known hosts.

Ubuntu 14.04

5. Visión de conjunto del cluster.

Las siguientes secciones describen cómo configurar una máquina ubuntu como maestro y la otra máquina ubuntu como esclavo. El nodo maestro también actuará como esclavo porque quiero tener dos máquinas disponibles en nuestro cluster para poder dispersar la capacidad de almacenamiento y procesamiento.

Figura 1: Imagen del cluster multi nodo, como acabará siendo.

El nodo maestro ejecutará los demonios maestros para cada capa:

   

    El NameNode para la capa de almacenamiento HDFS y

    El jobtracker para la capa de procesamiento MapReduce.

Ambas máquinas correrán los mismos demonios esclavos:

    El DataNode para la capa de almacenamiento HDFS y

    El TaskTracker para la capa de  procesamiento MapReduce.

Básicamente, los demonios maestro son responsables de coordinar y manejar los demonios esclavos, mientras que los demonios esclavos son responsables del trabajo de almacenar datos y procesarlos.

Maestros contra esclavos:

   

Típicamente al menos una máquina en el cluster se designa como NameNode y otra máquina exclusivamente es el JobTracker. Estos dos nodos (namenode y jobtracker) son nodos maestros (master nodes). El resto de máquinas en el cluster actúan como DataNode y TaskTrackers y se les conoce como nodos trabajadores (worker nodes).

6. Configuración

6.1 etc/hadoop/masters (únicamente en el maestro)

A pesar de su nombre, el fichero etc/hadoop/masters define en cuál máquina Hadoop arrancará el NameNode secundario en nuestro cluster multi nodo. En nuestro caso, el namenode secundario también hace de namenode primario. El NameNode primario y el JobTracker siempre serán las máquinas en las que ejecutarán los scripts bin/start-dfs.sh y bin/start-mapred.sh, respectivamente (el NameNode primario y el JobTracker empezarán a correr en la misma máquina si ejecutas el script bin/start-all.sh).

Nota: Puedes arrancar un demonio Hadoop manualmente en una máquina usando el script bin/hadoop-daemon.sh start [namenode | secondarynamenode | datanode | jobtracker | tasktracker], el cual no tendrá en cuenta los ficheros etc/hadoop/masters o conf/slaves.

Si te preguntas qué demonios hace un NameNode secundario, te diré que básicamente se encarga de mergear los distintos ficheros fsimage y los ficheros de log de manera que éstos siempre tengan un tamaño razonable. Normalmente este nodo corre en una máquina distinta del NameNode primario pues sus requerimientos de memoria son casi iguales al del primario. El NameNode secundario se arranca usando el script bin/start-dfs.sh en los nodos especificados en el fichero etc/hadoop/masters.

En la máquina que has elegido como primario, edita el fichero /usr/local/hadoop/etc/hadoop/masters (atención, puede que no exista por defecto y lo tengas que crear tu):

hduser@HadoopMaster:/usr/local/hadoop/etc/hadoop$ sudo gedit masters

## Add name of master nodes

master

6.2 etc/hadoop/slaves (únicamente en el maestro)

Este fichero lista los nodos, uno por línea, donde los demonios Hadoop (DataNodes y TaskTrackers) correrán. En este caso, quiero que tanto el maestro como el esclavo actúen como esclavos porque quiero que ambos nodos almacenen y procesen datos.

En la máquina que hace de maestro, actualiza el fichero etc/hadoop/slaves con este contenido.

hduser@HadoopMaster:/usr/local/hadoop/etc/hadoop$ sudo gedit slaves

## Add name of slaves nodes

master

slave

Si tuviéramos nodos esclavos adicionales, solo tienes que añadirlos a este fichero, un nombre de máquina por línea:

## Add name of slaves nodes

master

slave

anotherslave01

anotherslave02

anotherslave03

Nota: el fichero etc/hadoop/slaves en la máquina maestro se usa únicamente por algunos scripts, como bin/start-dfs.sh o bin/stop-dfs.sh. Por ejemplo, si quieres añadir nodos de datos al vuelo (para un futuro tutorial lo explico en profundidad), puedes arrancar manualmente el demonio DataNode en una nueva máquina esclavo usando el script con estos parámetros:

bin/hadoop-daemon.sh start datanode

6.3 etc/hadoop/core-site.xml (todos los nodos)

Añade la propiedad fs.default.name tal y como sale en este ejemplo.

Este fichero core-site.xml especifica propiedades específicas acerca de este nodo, por ejemplo:

<configuration>

<property>

 <name>fs.default.name</name>

 <value>hdfs://master:54310</value>

 <description>The name of the default file system.  A URI whose

 scheme and authority determine the FileSystem implementation.  The

 uri’s scheme determines the config property (fs.SCHEME.impl) naming

 the File System implementation class.  The uri’s authority is used to

 determine the host, port, etc. for a filesystem.</description>

</property>

<property>

 <name>hadoop.tmp.dir</name>

 <value>/app/hadoop/tmp</value>

 <description>A base for other temporary directories.</description>

</property>

</configuration>

6.4 etc/hadoop/mapred-site.xml (todos los nodos)

En este fichero que tenemos que actualizar en todos los nodos, indicamos que nodo es el que se va a encargar de ser el JobTracker, en este caso, el nodo maestro.

<configuration>

<property>

 <name>mapred.job.tracker</name>

 <value>master: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>

<property>

 <name>mapred.local.dir</name>

 <value>/app/hadoop/mapred-local</value>

 <description>Determines where temporary MapReduce data is written. It also may be a list of directories.

 </description>

</property>

<property>

 <name>mapred.map.tasks</name>

 <value>20</value>

 <description>As a rule of thumb, use 10x the number of slaves (i.e., number of TaskTrackers).

 </description>

</property>

<property>

 <name>mapred.reduce.tasks</name>

 <value>10</value>

 <description>As a rule of thumb, use num_tasktrackers * num_reduce_slots_per_tasktracker * 0.99. If num_tasktrackers is small (as in the case of this tutorial), use (num_tasktrackers – 1) * num_reduce_slots_per_tasktracker.

 </description>

</property>

</configuration>

6.5 etc/hadoop/hdfs-site.xml (todos los nodos)

Tenemos que cambiar la propiedad dfs.replication, que nos indica el nivel de replicación, es decir, en cuantas maquinas se va a replicar el fichero antes de volverse disponible en el cluster.

Atención, si te da por introducir un número superior al número de Data Nodes disponibles, empezarás a ver errores en los ficheros de log como “Zero targets found, forbidden1.size=1”.

Por defecto, esta propiedad está configurada con el valor “3”, pero en nuestro ejemplo solo tenemos dos maquinas, por lo que tenemos que cambiar esta propiedad.

<configuration>

<property>

 <name>dfs.replication</name>

 <value>2</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>

</configuration>

6.6 etc/hadoop/yarn-site.xml  (opcional, solo si se va a usar yarn)

## To edit file, fire the below given command

hduser@HadoopMaster:/usr/local/hadoop/etc/hadoop$ sudo gedit yarn-site.xml

## Paste/Update these lines into <configuration> tag

<property>

       <name>yarn.resourcemanager.resource-tracker.address</name>

       <value>master:8025</value>

</property>

<property>

       <name>yarn.resourcemanager.scheduler.address</name>

       <value>master:8035</value>

</property>

<property>

       <name>yarn.resourcemanager.address</name>

       <value>master:8050</value>

</property>

7. Formateando el sistema de ficheros HDFS a través del NameNode

Antes de que arranquemos nuestro nuevo cluster multi nodo, debemos formatear el sistema de ficheros distribuido entre todos los nodos de datos del cluster. Necesitas hacer esto la primera vez que configuras este nuevo cluster y recuerda, si haces esto con un cluster en producción que tiene datos reales, los vas a borrar.

Para formatear el sistema de ficheros (el cual simplemente inicializa el directorio especificado por la propiedad dfs.name.dir), debes lanzar el siguiente comando:

hduser@master:/usr/local/hadoop$ bin/hadoop namenode -format

… INFO dfs.Storage: Storage directory /app/hadoop/tmp/dfs/name has been successfully formatted.

Atención: El nombre de la tabla HDFS se almacena en el sistema de ficheros local del NameNode, concretamente en el directorio especificado por dfs.name.dir. El nombre de la tabla se usa por el NameNode para almacenar los rastreos (trackings) y la información de coordinación para los Data Nodes.

8. Arrancando el clúster multi-nodo

Arrancar el cluster se realiza en dos pasos. Empezamos arrancando los demonios HDFS, a saber, el demonio NameNode se arranca en el maestro, todos los demonios DataNode se arrancan en todos los esclavos (en este ejemplo, master y slave). Después se arrancan los demonios MapReduce, es decir, el JobTracker se arranca en el maestro, y los Task Trackers se arrancan en todos los esclavos (en este ejemplo, master y slave)

8.1 Demonios HDFS

Ejecuta el comando bin/start-dfs.sh en la maquina que quieres que sea el NameNode primario. Este comando levantará el HDFS con el NameNode corriendo y los Data Nodes se inicializan  en las máquinas que pusimos en el fichero etc/hadoop/slaves del NameNode.

En este caso, ejecutamos bin/start-dfs.sh en la maquina master:

hduser@master:/usr/local/hadoop$ bin/start-dfs.sh

starting namenode, logging to /usr/local/hadoop/bin/../logs/hadoop-hduser-namenode-master.out

slave: Ubuntu 14.04

slave: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-hduser-datanode-slave.out

master: starting datanode, logging to /usr/local/hadoop/bin/../logs/hadoop-hduser-datanode-master.out

master: starting secondarynamenode, logging to /usr/local/hadoop/bin/../logs/hadoop-hduser-secondarynamenode-master.out

En la máquina esclavo, podemos examinar el fichero de log logs/hadoop-hduser-datanode-slave.log para saber si todo ha ido bien o no.

… INFO org.apache.hadoop.dfs.Storage: Storage directory /app/hadoop/tmp/dfs/data is not formatted.

… INFO org.apache.hadoop.dfs.Storage: Formatting …

… INFO org.apache.hadoop.dfs.DataNode: Opened server at 50010

… INFO org.mortbay.util.Credential: Checking Resource aliases

… INFO org.mortbay.http.HttpServer: Version Jetty/5.1.4

… INFO org.mortbay.util.Container: Started org.mortbay.jetty.servlet.WebApplicationHandler@17a8a02

… INFO org.mortbay.util.Container: Started WebApplicationContext[/,/]

… INFO org.mortbay.util.Container: Started HttpContext[/logs,/logs]

… INFO org.mortbay.util.Container: Started HttpContext[/static,/static]

… INFO org.mortbay.http.SocketListener: Started SocketListener on 0.0.0.0:50075

… INFO org.mortbay.util.Container: Started org.mortbay.jetty.Server@56a499

… INFO org.apache.hadoop.dfs.DataNode: Starting DataNode in: FSDataset{dirpath=’/app/hadoop/tmp/dfs/data/current’}

… INFO org.apache.hadoop.dfs.DataNode: using BLOCKREPORT_INTERVAL of 3538203msec

Como puedes ver en la salida anterior del esclavo, se formateará automáticamente su directorio de almacenamiento (el que especificamos con la propiedad dfs.data.dir) si no se encuentra ya formateado. También creará el directorio si no existe.

En este punto, podemos usar el comando jps en el master y ver la salida:

Procesos java en el nodo maestro después de arrancar los demonios HDFS:

   

hduser@master:/usr/local/hadoop$ jps

14799 NameNode

15314 Jps

14880 DataNode

14977 SecondaryNameNode

Procesos java en el nodo esclavo después de arrancar los demonios HDFS:

hduser@slave:/usr/local/hadoop$ jps

15183 DataNode

15616 Jps

8.2 Demonios MapReduce

Ejecuta el comando bin/start-mapred.sh en la maquina que quieres que haga de JobTracker.

hduser@master:/usr/local/hadoop$ bin/start-mapred.sh

starting jobtracker, logging to /usr/local/hadoop/bin/../logs/hadoop-hadoop-jobtracker-master.out

slave: Ubuntu 14.04

slave: starting tasktracker, logging to /usr/local/hadoop/bin/../logs/hadoop-hduser-tasktracker-slave.out

master: starting tasktracker, logging to /usr/local/hadoop/bin/../logs/hadoop-hduser-tasktracker-master.out

En la máquina esclavo, puedes examinar el estado del comando inspeccionando el fichero log logs/hadoop-hduser-tasktracker-slave.log.

… INFO org.mortbay.util.Credential: Checking Resource aliases

… INFO org.mortbay.http.HttpServer: Version Jetty/5.1.4

… INFO org.mortbay.util.Container: Started org.mortbay.jetty.servlet.WebApplicationHandler@d19bc8

… INFO org.mortbay.util.Container: Started WebApplicationContext[/,/]

… INFO org.mortbay.util.Container: Started HttpContext[/logs,/logs]

… INFO org.mortbay.util.Container: Started HttpContext[/static,/static]

… INFO org.mortbay.http.SocketListener: Started SocketListener on 0.0.0.0:50060

… INFO org.mortbay.util.Container: Started org.mortbay.jetty.Server@1e63e3d

… INFO org.apache.hadoop.ipc.Server: IPC Server listener on 50050: starting

… INFO org.apache.hadoop.ipc.Server: IPC Server handler 0 on 50050: starting

… INFO org.apache.hadoop.mapred.TaskTracker: TaskTracker up at: 50050

… INFO org.apache.hadoop.mapred.TaskTracker: Starting tracker tracker_slave:50050

… INFO org.apache.hadoop.ipc.Server: IPC Server handler 1 on 50050: starting

… INFO org.apache.hadoop.mapred.TaskTracker: Starting thread: Map-events fetcher for all reduce tasks on tracker_slave:50050

En este punto, los siguientes procesos java deberian correr en el master:

hduser@master:/usr/local/hadoop$ jps

16017 Jps

14799 NameNode

15686 TaskTracker

14880 DataNode

15596 JobTracker

14977 SecondaryNameNode

Y los siguientes en el esclavo:

hduser@slave:/usr/local/hadoop$ jps

15183 DataNode

15897 TaskTracker

16284 Jps

9. Parando el cluster multi nodo

Igual que la operación de arranque, pararlo se hace en dos pasos. Aun así, el flujo de trabajo es justo el contrario del que tiene el de arranque.

Primero hay que parar los demonios MapReduce, el demonio JobTracker se para en el maestro y los demonios de los Task Trackers se paran en todos los esclavos.

Recuerda que en este ejemplo de configuración, el nodo maestro también actúa de nodo esclavo.

9.1 Demonios MapReduce

Ejecuta el comando bin/stop-mapred.sh en la máquina que hayas definido como JobTracker.

Ejecutando stop-mapred.sh en la maquina master:

hduser@master:/usr/local/hadoop$ bin/stop-mapred.sh

stopping jobtracker

slave: Ubuntu 14.04

master: stopping tasktracker

slave: stopping tasktracker

Ejecutando jps en el master:

hduser@master:/usr/local/hadoop$ jps

14799 NameNode

18386 Jps

14880 DataNode

14977 SecondaryNameNode

Ejecutando jps en el esclavo:

hduser@slave:/usr/local/hadoop$ jps

15183 DataNode

18636 Jps

9.2 Demonios HDFS

Ejecuta este comando bin/stop-dfs.sh en la máquina NameNode. Este comando apagará el HDFS parando todos los demonios de los Data Nodes tal y como aparecen listados en el fichero etc/hadoop/slaves.

En nuestro caso, ejecutamos bin/stop-dfs.sh en la maquina master:

hduser@master:/usr/local/hadoop$ bin/stop-dfs.sh

stopping namenode

slave: Ubuntu 14.04

slave: stopping datanode

master: stopping datanode

master: stopping secondarynamenode

Lanzando jps en el master:

hduser@master:/usr/local/hadoop$ jps

18670 Jps

Lanzando jps en el esclavo:

   

hduser@slave:/usr/local/hadoop$ jps

18894 Jps

Como puedes ver, los procesos en el esclavo se han terminado.

10. Ejecutar una tarea MapReduce spark en el nuevo cluster multi nodo

PENDIENTE

enlaces de interés:

http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/

ANEXO

Este tutorial va de como pasar de un cluster en modo pseudodistribuido a un cluster distribuido y para ello hemos configurado dos maquinas siguiendo el enlace sobre como configurar un cluster pseudodistribuido. Tambien podriamos haber configurado una sola maquina, una maestra de tipo Name Node y luego usando el comando rsync copiar el directorio /usr/local/hadoop a los otros nodos.

Para ello, lo primero es instalar rsync:

alonso@alonso:/usr/local/hadoop/etc/hadoop$ sudo apt-get install rsync

[sudo] password for alonso:

Leyendo lista de paquetes… Hecho

Creando árbol de dependencias

Leyendo la información de estado… Hecho

rsync ya está en su versión más reciente.

0 actualizados, 0 se instalarán, 0 para eliminar y 0 no actualizados.

Como podeis ver, rsync está instalado y listo para funcionar.

Use rsync for distributing configured Hadoop source among rest of nodes via network.

# In Slave machine

sudo rsync -avxP /usr/local/hadoop/
hduser@slave:/usr/local/hadoop/

Si tuvieramos mas esclavos…

# In HadoopSlave2 machine

sudo rsync -avxP
/usr/local/hadoop/ hduser@HadoopSlave2:/usr/local/hadoop/

Este comando compartirá los ficheros almacenados dentro de la carpeta hadoop a los nodos que hayamos elegidos como esclavos, concretamente en las carpetas de los esclavos /usr/local/hadoop.

De esta manera, no tienes que descargar ni configurar multiples nodos, bueno, hay que configurarlos un poquito. Solo necesitas tener java y rsync en todos los nodos. Debes asegurarte que la variable JAVA_HOME en todos los nodoso sea igual a la que aparece en $HADOOP_HOME/etc/hadoop/hadoop-env.sh. Leer el resto de esta entrada »

1. Instalando Java

Lo primero es instalar el JDK, a ser posible el de Oracle, aunque tambien deberia funcionar con el openJdk. Voy a trabajar con ubuntu 14.0.4 porque es una distribución conocida y disponible a través de Amazon. Hay muchas formas de instalar el JDK pero yo creo que la mas sencilla es a traves de la maravillosa herramienta apt. Lanza estos comandos en una terminal:

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java8-installer

Te pedirá que aceptes el contrato que haces con Oracle, aceptar a todo. Una vez terminado el proceso, lanza estos comandos:

alonso@alonso:/usr/local/hadoop/sbin$ java -version

java version “1.8.0_66”

Java(TM) SE Runtime Environment (build 1.8.0_66-b17)

Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

alonso@alonso:/usr/local/hadoop/sbin$ javac -version

javac 1.8.0_66

La version entre javac y java deben coincidir.

Existe una manera de instalar el JDK sin necesidad de tener que aceptar la licencia, ideal si queremos automatizar la instalacion del JDK si usamos Docker, Ansible o herramientas parecidas. Para ello, lanza el siguiente comando:

echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections

2. Añadiendo un grupo dedicado hadoop y un usuario especifico para interacturar con el cluster. 

Una vez que tienes java listo y configurado, seguimos con los siguientes pasos. El grupo se llamará hadoop y el usuario hduser, para ello lanza los siguientes comandos:

sudo addgroup hadoop

sudo adduser –ingroup hadoop hduser

Cuando lances este segundo comando, apunta la contraseña.

alonso@laptop:~$ sudo addgroup hadoop

Adding group `hadoop’ (GID 1002) …

Done.

alonso@laptop:~$ sudo adduser –ingroup hadoop hduser

Adding user `hduser’ …

Adding new user `hduser’ (1001) with group `hadoop’ …

Creating home directory `/home/hduser’ …

Copying files from `/etc/skel’ …

Enter new UNIX password: 

Retype new UNIX password: 

passwd: password updated successfully

Changing the user information for hduser

Enter the new value, or press ENTER for the default

Full Name []: 

Room Number []: 

Work Phone []: 

Home Phone []: 

Other []: 

Is the information correct? [Y/n] Y

3. Instalando SSH

Hay que tener en cuenta que ssh tiene dos componentes principales, ssh y sshd. Ssh es el cliente que usamos para conectarnos a maquinas remotas. Sshd es el demonio del sistema que permite que otros clientes externos se conecten al servidor. Para ello, lanza los siguientes comandos:

sudo apt-get install ssh

4. Crear y configurar el certificado SSH

Hadoop usa SSH para acceder a sus nodos para no tener que introducir el password cada vez que necesite acceder. Aunque, este requerimiento puede ser eleminado creando y configurando certificados ssh, para ello, hay que lanzar los siguientes comandos. Si te preguntan por el nombre de un fichero, dejalo en blanco y presiona alguna tecla para continuar.

Si no estas como el usuario hduser, cambiate a él:

su hduser

Una vez que eres el usuario hduser, lanza este comando:

ssh-keygen -t rsa -P “”

Generating public/private rsa key pair.

Enter file in which to save the key (/home/hduser/.ssh/id_rsa): 

Created directory ‘/home/hduser/.ssh’.

Your identification has been saved in /home/hduser/.ssh/id_rsa.

Your public key has been saved in /home/hduser/.ssh/id_rsa.pub.

The key fingerprint is:

50:6b:f3:fc:0f:32:bf:30:79:c2:41:71:26:cc:7d:e3 hduser@laptop

The key’s randomart image is:

+–[ RSA 2048]—-+

|        .oo.o    |

|       . .o=. o  |

|      . + .  o . |

|       o =    E  |

|        S +      |

|         . +     |

|          O +    |

|           O o   |

|            o..  |

+—————–+

Una vez que el certificado se ha generado, hay que copiarlo donde el sistema pueda encontrarlo:

hduser@laptop:/home/k$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

Una vez hecho ésto, comprobamos que funciona con el siguiente comando:

hduser@laptop:/home/k$ ssh localhost

The authenticity of host ‘localhost (127.0.0.1)’ can’t be established.

ECDSA key fingerprint is e1:8b:a0:a5:75:ef:f4:b4:5e:a9:ed:be:64:be:5c:2f.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added ‘localhost’ (ECDSA) to the list of known hosts.

Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-40-generic x86_64)

5. Instalar Hadoop 2.6.0

Una vez terminados los preliminares, vamos al lio. Primero es descargar los fuentes. Lanza estos comandos en un directorio donde puedas escribir:

hduser@laptop:~$ wget http://mirrors.sonic.net/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz

Descomprimes el fichero comprimido:

hduser@laptop:~$ tar xvzf hadoop-2.6.0.tar.gz

Ahora vamos a mover el contenido de esta carpeta a un sitio como /usr/local/hadoop, pero antes algo de preparacion.

Probablemente tendras que crear la carpeta /usr/local/hadoop y meter al usuario hduser en el grupo de los sudoers. Para ello, lanza los siguientes comandos:

Siempre como usuario hduser:

mkdir /usr/local/hadoop

Para lo segundo, meter al usuario hduser en el grupo de los sudoers, haz lo siguiente. Te cambias al usuario que tienes por defecto en el laptop, en mi caso, alonso:

su alonso

sudo adduser hduser sudo

[sudo] password for alonso: 

Adding user `hduser’ to group `sudo’ …

Adding user hduser to group sudo

Done.

Con esto, el usuario hduser esta en el grupo de los superusuarios, podemos mover los ficheros de hadoop que hemos descargado anteriormente a un sitio mas apropiado. Para ello, lanza estos comandos:

alonso@laptop:/home/hduser$ sudo su hduser

hduser@laptop:~/hadoop-2.6.0$ sudo mv * /usr/local/hadoop 

Con este comando, indicamos al sistema que el propietario de esos ficheros es el usuario hduser:

hduser@laptop:~/hadoop-2.6.0$ sudo chown -R hduser:hadoop /usr/local/hadoop

6. Configurar ficheros 

En concreto, tienes que configurar estos cinco ficheros:

6.1 /etc/bash.bashrc

6.2 /usr/local/hadoop/etc/hadoop/hadoop-env.sh

6.3 /usr/local/hadoop/etc/hadoop/core-site.xml

6.4 /usr/local/hadoop/etc/hadoop/mapred-site.xml.template

6.5 /usr/local/hadoop/etc/hadoop/hdfs-site.xml

6.1 /etc/bash.bashrc

Edita el primer fichero, queremos hacer que ciertas variables globales como JAVA_HOME o HADOOP_HOME esten disponibles para todos los usuarios, asi que añade esto al final del fichero /etc/bash.bashrc

#HADOOP VARIABLES START

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

export HADOOP_INSTALL=/usr/local/hadoop

export PATH=$PATH:$HADOOP_INSTALL/bin

export PATH=$PATH:$HADOOP_INSTALL/sbin

export HADOOP_MAPRED_HOME=$HADOOP_INSTALL

export HADOOP_COMMON_HOME=$HADOOP_INSTALL

export HADOOP_HDFS_HOME=$HADOOP_INSTALL

export YARN_HOME=$HADOOP_INSTALL

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native

export HADOOP_OPTS=”-Djava.library.path=$HADOOP_INSTALL/lib”

#HADOOP VARIABLES END

Actualiza la shell:

source /etc/bash.bashrc

Ahora, al hacer un echo $JAVA_HOME deberias ver /usr/lib/jvm/java-8-oracle

6.2 /usr/local/hadoop/etc/hadoop/hadoop-env.sh 

Actualiza el fichero añadiendo la misma ruta JAVA_HOME. Ponla a fuego, puede que te encuentres una linea como ésta:

export JAVA_HOME=${JAVA_HOME}

En teoria, no deberia hacer falta poner a fuego la ruta absoluta, pero tienes que cambiarla por ésta:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

6.3 /usr/local/hadoop/etc/hadoop/core-site.xml

Crea este directorio y asigna como propietario al usuario hduser:

hduser@laptop:~$ sudo mkdir -p /app/hadoop/tmp

hduser@laptop:~$ sudo chown hduser:hadoop /app/hadoop/tmp

Ahora abre el fichero y modificalo añadiendo las dos propiedades:

hduser@laptop:~$ vi /usr/local/hadoop/etc/hadoop/core-site.xml

<configuration>

 <property>

  <name>hadoop.tmp.dir</name>

  <value>/app/hadoop/tmp</value>

  <description>A base for other temporary directories.</description>

 </property>

 <property>

  <name>fs.default.name</name>

  <value>hdfs://localhost:54310</value>

  <description>The name of the default file system.  A URI whose

  scheme and authority determine the FileSystem implementation.  The

  uri’s scheme determines the config property (fs.SCHEME.impl) naming

  the FileSystem implementation class.  The uri’s authority is used to

  determine the host, port, etc. for a filesystem.</description>

 </property>

</configuration>

6.4 /usr/local/hadoop/etc/hadoop/mapred-site.xml.template

Tienes que crear este fichero, para ello vas a copiar un fichero template que viene con hadoop. Lanza este comando:

hduser@laptop:~$ cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml

Este fichero mapred-site.xml sirve para indicar al sistema que framework se va a usar para realizar las tareas map reduce, añade el property entre la etiqueta configuration:

<configuration>

 <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>

</configuration>

6.5 /usr/local/hadoop/etc/hadoop/hdfs-site.xml

Este fichero necesita ser configurado para cada nodo en el cluster que esta siendo usado. Concretamente se usa para especificar los directorios que serán usados por los componentes NameNode y DataNode en ese nodo.

Antes de editar este fichero, necesitamos crear dos directorios que contendran el namenode y el datanode:

hduser@laptop:~$ sudo mkdir -p /usr/local/hadoop_store/hdfs/namenode

hduser@laptop:~$ sudo mkdir -p /usr/local/hadoop_store/hdfs/datanode

hduser@laptop:~$ sudo chown -R hduser:hadoop /usr/local/hadoop_store

Abre el fichero e introduce el siguiente contenido entre el inicio y fin de la etiqueta configuration:

hduser@laptop:~$ vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml

<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>

 <property>

   <name>dfs.namenode.name.dir</name>

   <value>file:/usr/local/hadoop_store/hdfs/namenode</value>

 </property>

 <property>

   <name>dfs.datanode.data.dir</name>

   <value>file:/usr/local/hadoop_store/hdfs/datanode</value>

 </property>

</configuration>

7. Formatear el sistema de ficheros de los nodos

Ahora, el sistema de ficheros necesita ser formateado de manera que podamos usarlo. El comando format debe ser lanzado con un usuario con permisos de escritura, ya que este comando al final lo que hace es crear un directorio llamado current.

Posicionate en el directorio /usr/local/hadoop_store/hdfs/namenode y lanza el siguiente comando:

hduser@laptop:~$ hadoop namenode -format

DEPRECATED: Use of this script to execute hdfs command is deprecated.

Instead use the hdfs command for it.

15/04/18 14:43:03 INFO namenode.NameNode: STARTUP_MSG: 

/************************************************************

STARTUP_MSG: Starting NameNode

STARTUP_MSG:   host = laptop/192.168.1.1

STARTUP_MSG:   args = [-format]

STARTUP_MSG:   version = 2.6.0

STARTUP_MSG:   classpath = /usr/local/hadoop/etc/hadoop

STARTUP_MSG:   java = 1.8.0_66

************************************************************/

15/04/18 14:43:03 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]

15/04/18 14:43:03 INFO namenode.NameNode: createNameNode [-format]

15/04/18 14:43:07 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

Formatting using clusterid: CID-e2f515ac-33da-45bc-8466-5b1100a2bf7f

15/04/18 14:43:09 INFO namenode.FSNamesystem: No KeyProvider found.

15/04/18 14:43:09 INFO namenode.FSNamesystem: fsLock is fair:true

15/04/18 14:43:10 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=1000

15/04/18 14:43:10 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-check=true

15/04/18 14:43:10 INFO blockmanagement.BlockManager: dfs.namenode.startup.delay.block.deletion.sec is set to 000:00:00:00.000

15/04/18 14:43:10 INFO blockmanagement.BlockManager: The block deletion will start around 2015 Apr 18 14:43:10

15/04/18 14:43:10 INFO util.GSet: Computing capacity for map BlocksMap

15/04/18 14:43:10 INFO util.GSet: VM type       = 64-bit

15/04/18 14:43:10 INFO util.GSet: 2.0% max memory 889 MB = 17.8 MB

15/04/18 14:43:10 INFO util.GSet: capacity      = 2^21 = 2097152 entries

15/04/18 14:43:10 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=false

15/04/18 14:43:10 INFO blockmanagement.BlockManager: defaultReplication         = 1

15/04/18 14:43:10 INFO blockmanagement.BlockManager: maxReplication             = 512

15/04/18 14:43:10 INFO blockmanagement.BlockManager: minReplication             = 1

15/04/18 14:43:10 INFO blockmanagement.BlockManager: maxReplicationStreams      = 2

15/04/18 14:43:10 INFO blockmanagement.BlockManager: shouldCheckForEnoughRacks  = false

15/04/18 14:43:10 INFO blockmanagement.BlockManager: replicationRecheckInterval = 3000

15/04/18 14:43:10 INFO blockmanagement.BlockManager: encryptDataTransfer        = false

15/04/18 14:43:10 INFO blockmanagement.BlockManager: maxNumBlocksToLog          = 1000

15/04/18 14:43:10 INFO namenode.FSNamesystem: fsOwner             = hduser (auth:SIMPLE)

15/04/18 14:43:10 INFO namenode.FSNamesystem: supergroup          = supergroup

15/04/18 14:43:10 INFO namenode.FSNamesystem: isPermissionEnabled = true

15/04/18 14:43:10 INFO namenode.FSNamesystem: HA Enabled: false

15/04/18 14:43:10 INFO namenode.FSNamesystem: Append Enabled: true

15/04/18 14:43:11 INFO util.GSet: Computing capacity for map INodeMap

15/04/18 14:43:11 INFO util.GSet: VM type       = 64-bit

15/04/18 14:43:11 INFO util.GSet: 1.0% max memory 889 MB = 8.9 MB

15/04/18 14:43:11 INFO util.GSet: capacity      = 2^20 = 1048576 entries

15/04/18 14:43:11 INFO namenode.NameNode: Caching file names occuring more than 10 times

15/04/18 14:43:11 INFO util.GSet: Computing capacity for map cachedBlocks

15/04/18 14:43:11 INFO util.GSet: VM type       = 64-bit

15/04/18 14:43:11 INFO util.GSet: 0.25% max memory 889 MB = 2.2 MB

15/04/18 14:43:11 INFO util.GSet: capacity      = 2^18 = 262144 entries

15/04/18 14:43:11 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct = 0.9990000128746033

15/04/18 14:43:11 INFO namenode.FSNamesystem: dfs.namenode.safemode.min.datanodes = 0

15/04/18 14:43:11 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension     = 30000

15/04/18 14:43:11 INFO namenode.FSNamesystem: Retry cache on namenode is enabled

15/04/18 14:43:11 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis

15/04/18 14:43:11 INFO util.GSet: Computing capacity for map NameNodeRetryCache

15/04/18 14:43:11 INFO util.GSet: VM type       = 64-bit

15/04/18 14:43:11 INFO util.GSet: 0.029999999329447746% max memory 889 MB = 273.1 KB

15/04/18 14:43:11 INFO util.GSet: capacity      = 2^15 = 32768 entries

15/04/18 14:43:11 INFO namenode.NNConf: ACLs enabled? false

15/04/18 14:43:11 INFO namenode.NNConf: XAttrs enabled? true

15/04/18 14:43:11 INFO namenode.NNConf: Maximum size of an xattr: 16384

15/04/18 14:43:12 INFO namenode.FSImage: Allocated new BlockPoolId: BP-130729900-192.168.1.1-1429393391595

15/04/18 14:43:12 INFO common.Storage: Storage directory /usr/local/hadoop_store/hdfs/namenode has been successfully formatted.

15/04/18 14:43:12 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0

15/04/18 14:43:12 INFO util.ExitUtil: Exiting with status 0

15/04/18 14:43:12 INFO namenode.NameNode: SHUTDOWN_MSG: 

/************************************************************

SHUTDOWN_MSG: Shutting down NameNode at laptop/192.168.1.1

************************************************************/

Date cuenta que este comando deberia ser ejecutado antes de que empezemos a usar el cluster. Si lo usas despues de que Hadoop haya sido utilizado, TODOS los datos del sistema de ficheros hadoop serán destruidos.

8. Arrancar el sistema y comprobar su estado

Ahora estas en disposicion de iniciar tu cluster con un unico nodo. Para ello, podemos usar unos scripts, start-all.sh, tambien start-dfs.sh o start-yarn.sh

hduser@laptop:~$ cd /usr/local/hadoop/sbin

hduser@laptop:/usr/local/hadoop/sbin$ ls

distribute-exclude.sh    start-all.cmd        stop-balancer.sh

hadoop-daemon.sh         start-all.sh         stop-dfs.cmd

hadoop-daemons.sh        start-balancer.sh    stop-dfs.sh

hdfs-config.cmd          start-dfs.cmd        stop-secure-dns.sh

hdfs-config.sh           start-dfs.sh         stop-yarn.cmd

httpfs.sh                start-secure-dns.sh  stop-yarn.sh

kms.sh                   start-yarn.cmd       yarn-daemon.sh

mr-jobhistory-daemon.sh  start-yarn.sh        yarn-daemons.sh

refresh-namenodes.sh     stop-all.cmd

slaves.sh                stop-all.sh

hduser@laptop:~$ start-all.sh

This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh

15/04/18 16:43:13 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

Starting namenodes on [localhost]

localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hduser-namenode-laptop.out

localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hduser-datanode-laptop.out

Starting secondary namenodes [0.0.0.0]

0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hduser-secondarynamenode-laptop.out

15/04/18 16:43:58 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

starting yarn daemons

starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-hduser-resourcemanager-laptop.out

localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hduser-nodemanager-laptop.out

Si ves todo eso, vamos bien, ahora, para comprobar que todo está levantado y funcionando, puedes lanzar unos comandos, como jps o netstat.

hduser@laptop:/usr/local/hadoop/sbin$ jps

9026 NodeManager

7348 NameNode

9766 Jps

8887 ResourceManager

7507 DataNode

La salida significa que tenemos una instancia funcional de hadoop corriendo en nuestra maquina.

Otra manera usando el comando netstat:

hduser@alonso:/usr/lib/jvm/java-8-oracle$ netstat -plten | grep java

(No todos los procesos pueden ser identificados, no hay información de propiedad del proceso

 no se mostrarán, necesita ser superusuario para verlos todos.)

tcp        0      0 0.0.0.0:50070           0.0.0.0:*               ESCUCHAR    1001       869578      1985/java       

tcp        0      0 0.0.0.0:50010           0.0.0.0:*               ESCUCHAR    1001       871864      2142/java       

tcp        0      0 0.0.0.0:50075           0.0.0.0:*               ESCUCHAR    1001       871871      2142/java       

tcp        0      0 0.0.0.0:50020           0.0.0.0:*               ESCUCHAR    1001       868559      2142/java       

tcp        0      0 127.0.0.1:54310         0.0.0.0:*               ESCUCHAR    1001       871633      1985/java       

tcp        0      0 0.0.0.0:50090           0.0.0.0:*               ESCUCHAR    1001       868573      2433/java       

tcp6       0      0 :::8088                 :::*                    ESCUCHAR    1001       852252      31051/java      

tcp6       0      0 :::8030                 :::*                    ESCUCHAR    1001       852243      31051/java      

tcp6       0      0 :::8031                 :::*                    ESCUCHAR    1001       852236      31051/java      

tcp6       0      0 :::8032                 :::*                    ESCUCHAR    1001       852248      31051/java      

tcp6       0      0 :::8033                 :::*                    ESCUCHAR    1001       853285      31051/java      

tcp6       0      0 :::36805                :::*                    ESCUCHAR    1001       868596      2746/java       

tcp6       0      0 :::8040                 :::*                    ESCUCHAR    1001       868603      2746/java       

tcp6       0      0 :::8042                 :::*                    ESCUCHAR    1001       875530      2746/java

9. Parar el cluster

Para parar el cluster configurado de esta manera, tendrias que ir al directorio /usr/local/hadoop/sbin y lanzar el script stop-all.sh. Si lo has lanzado con start-dfs.sh, tienes que usar el comando stop-dfs.sh. Lo mismo aplica si has usado start-yarn.sh, debes usar stop-yarn.sh.

hduser@alonso:/usr/lib/jvm/java-8-oracle$ cd /usr/local/hadoop

hduser@alonso:/usr/local/hadoop$ ls

bin  etc  include  lib  libexec  LICENSE.txt  logs  NOTICE.txt  README.txt  sbin  share

hduser@alonso:/usr/local/hadoop$ cd sbin/

hduser@alonso:/usr/local/hadoop/sbin$ ls

distribute-exclude.sh  hdfs-config.cmd  kms.sh                   slaves.sh      start-balancer.sh  start-secure-dns.sh  stop-all.cmd      stop-dfs.cmd        stop-yarn.cmd   yarn-daemons.sh

hadoop-daemon.sh       hdfs-config.sh   mr-jobhistory-daemon.sh  start-all.cmd  start-dfs.cmd      start-yarn.cmd       stop-all.sh       stop-dfs.sh         stop-yarn.sh

hadoop-daemons.sh      httpfs.sh        refresh-namenodes.sh     start-all.sh   start-dfs.sh       start-yarn.sh        stop-balancer.sh  stop-secure-dns.sh  yarn-daemon.sh

hduser@alonso:/usr/local/hadoop/sbin$ sh stop-all.sh 

This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh

stop-all.sh: 99: /usr/local/hadoop/sbin/../libexec/hadoop-config.sh: Syntax error: word unexpected (expecting “)”)

Vaya! si lanzas el comando usando sh, el script fracasa. Debes lanzarlo asi:

hduser@alonso:/usr/local/hadoop/sbin$ ./stop-all.sh 

This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh

15/12/11 10:56:50 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

Stopping namenodes on [localhost]

localhost: stopping namenode

localhost: stopping datanode

Stopping secondary namenodes [0.0.0.0]

0.0.0.0: stopping secondarynamenode

15/12/11 10:57:10 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

stopping yarn daemons

stopping resourcemanager

localhost: stopping nodemanager

no proxyserver to stop

Tambien puedes lanzarlos sin el punto barra. Estos scripts deberian tener permiso de ejecucion.

10. Usar la interfaz de usuario web que provee hadoop

Si no tienes arrancado hadoop, arrancalo ahora:

hduser@alonso:/usr/local/hadoop/sbin$ ./start-all.sh 

This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh

15/12/11 10:58:59 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

Starting namenodes on [localhost]

localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hduser-namenode-alonso.out

localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hduser-datanode-alonso.out

Starting secondary namenodes [0.0.0.0]

0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hduser-secondarynamenode-alonso.out

15/12/11 10:59:14 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

starting yarn daemons

starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-hduser-resourcemanager-alonso.out

localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hduser-nodemanager-alonso.out

hduser@alonso:/usr/local/hadoop/sbin$ ./stop-all.sh 

This script is Deprecated. Instead use stop-dfs.sh and stop-yarn.sh

15/12/11 11:01:39 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

Stopping namenodes on [localhost]

localhost: stopping namenode

localhost: stopping datanode

Stopping secondary namenodes [0.0.0.0]

0.0.0.0: stopping secondarynamenode

15/12/11 11:01:57 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

stopping yarn daemons

stopping resourcemanager

localhost: stopping nodemanager

no proxyserver to stop

hduser@alonso:/usr/local/hadoop/sbin$ start-all.sh 

This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh

15/12/11 11:02:33 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

Starting namenodes on [localhost]

localhost: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hduser-namenode-alonso.out

localhost: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hduser-datanode-alonso.out

Starting secondary namenodes [0.0.0.0]

0.0.0.0: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hduser-secondarynamenode-alonso.out

15/12/11 11:02:48 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

starting yarn daemons

starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-hduser-resourcemanager-alonso.out

localhost: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-hduser-nodemanager-alonso.out

Introduce la url http://localhost:50070/ en tu navegador. Deberias ver la interfaz de usuario del demonio que controla el NameNode maestro.

Si quieres ver la interfaz de usuario del NameNode secundario, utiliza esta direccion: http://localhost:50090/

Usando estas interfaces puedes ver bastantes cosas, como el estado del DataNode, los ficheros logs, puedes explorar el sistema de ficheros tambien como lo hace HUE.

Con esto, me despido.

Alonso

enlaces de interes:

http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html

https://help.ubuntu.com/community/Java

I am following a course from datastax in order to have a better understand dealing with Cassandra. This is a very useful introduction.

Useful links

https://aironman2k.wordpress.com/2015/09/23/primeros-pasos-con-cassandra/

https://aironman2k.wordpress.com/2015/09/28/primeros-pasos-con-cassandra-y-java/

https://aironman2k.wordpress.com/2015/10/05/about-how-to-start-with-apache-spark-apache-cassandra-scala-and-maven/

View story at Medium.com

https://cassandra.apache.org/doc/cql3/CQL.html

http://www.datastax.com/dev/blog/advanced-time-series-with-cassandra

http://wiki.apache.org/cassandra/DataModel

http://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling

Recently a new friend from Facebook told me about how to interact with Twitter using java code. Some time ago i used a great api, twitter4j from Yusuke, for me, a great and very clean developer.

I just have upload the sample to a repository in github, so download it and have some fun. You have to create some credentials to interact with twitter. Use this link and use the button Create new App, provide the necessary to the form and the twitter system will provide you with your credentials.

Captura de pantalla 2015-10-12 a las 16.57.07

Captura de pantalla 2015-10-12 a las 16.59.38

Captura de pantalla 2015-10-12 a las 17.01.05

As you can imagine, you just have to substitute the content of the numbers 1 to 4 in your code. The sample is named

ToGetTweeets.java.

Captura de pantalla 2015-09-28 a las 19.41.15

Have fun!

Alonso

PD

it could be fun if i create a web service using apache cxf and then integrate it with spring integration in order i can ask twitter about the twits from somebody and show them in web browser in real time with web sockets. All i have to do is to use the idea from dublin bus web socket example.

Disclaimer, i am using this text from wikipedia in order to get things clear in my head :)

Please, read and understand the cap theorem:

from the bless wikipedia:

In theoretical computer science, the CAP theorem, also known as Brewer’s theorem, states that it is impossible for a distributed computer system to simultaneously provide all three of the following guarantees:[1][2][3]

  • Consistency (all nodes see the same data at the same time)
  • Availability (a guarantee that every request receives a response about whether it succeeded or failed)
  • Partition tolerance (the system continues to operate despite arbitrary partitioning due to network failures)

In 2012 Brewer clarified some of his positions, including why the oft-used “two out of three” concept can be misleading or misapplied, and the different definition of consistency used in CAP relative to the one used in ACID.[4]

AP: CassandraCouchDB, DynamoDB,InfiniteGraph

CP: HBasePaxos, MongoDB,Redis

CA: RDBMS like mysql, oracle,SQL server, Neo4J

useful links:

https://en.wikipedia.org/wiki/CAP_theorem

https://es.wikipedia.org/wiki/Teorema_CAP

http://www.genbetadev.com/bases-de-datos/nosql-clasificacion-de-las-bases-de-datos-segun-el-teorema-cap

Hi, i am playing with this two technologies, apache spark and Cassandra, learning how to code a driver using scala and maven. I am using latest versions of these technologies. As usual, the most impatients can use this link to download the code from github.

In a previous entry i wrote about how to install, configure and use the shell to run queries against a Cassandra database. Now i am going to show the first steps to run java code against Cassandra. The impatients can download the project from github using this link.

It is a maven project so you will have to install it following this link if you are using windows, or using brew if you are an osX user, remember, brew install maven ;) or if you are using some flavour of linux, i recommend to do it through your package manager.

Once we have installed maven, you have to import to eclipse following this sequence, on JavaEE perspective, on project explorer, right click, import, existing maven project, select the root folder of your project, the one with the pom.xml file inside, the click finish. You should see a screenshot like this:

Captura de pantalla 2015-09-28 a las 19.41.15

The project actually consists in a main class which creates a keyspace, remember a keyspace is the equivalent to a relational schema, next i delete it, next i create a new one, next i make some inserts, some deletes and some updates, finally i close the Cassandra session. The code is pretty simple and self explainable. Later i will update the repo in order to do more complex tasks like connect apache spark with Cassandra using java and scala.

See you soon

Alonso

En la anterior entrada escribí acerca de como instalar, configurar y usar la linea de comandos para atacar una base de datos Cassandra. Ahora voy a mostrar los primeros pasos para atacar Cassandra usando código java. Los mas impacientes pueden descargarse el proyecto base desde github usando este enlace.

Es un proyecto maven por lo que tendréis que instalarlo siguiendo este enlace si teneis windows, o usando brew si tienes osx, o si tienes algun sabor de linux tendrás que averiguar que gestor de paquetes usa tu distribución pues la cosa varia dependiendo de cual sea.

Cuando tenemos maven instalado y configurado para ser usado por Eclipse, importamos el proyecto siguiendo esta secuencia, sobre la perspectiva Java EE, en Project Explorer, click boton derecho, import, Existing maven project, seleccionamos la carpeta del proyecto, la que tiene dentro el fichero pom.xml, hacemos click en finish. Deberías ver el proyecto tal y como aparece en el pantallazo.

Captura de pantalla 2015-09-28 a las 19.41.15

El proyecto actualmente consiste en un main el cual crea un keyspace, acordaos que el keyspace es el equivalente al esquema en bases de datos relacionales, lo borra, hago unas inserciones, las borro y las actualizo, para finalmente cerrar la sesión con Cassandra. El código es bastante sencillo y autoexplicable. Mas adelante iré actualizando el repositorio para hacer cosas mas complejas como conectar apache spark y Cassandra usando java y también como hacerlo usando scala.

Hasta entonces

Alonso

enlaces de interes:

http://brew.sh

https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

http://duckydebug.net/instalar-maven-en-linux-y-ubuntu/

http://stackoverflow.com/questions/16870502/how-to-connect-cassandra-using-java-class

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 147 seguidores