Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Arquitectura
NameNode (master): Sólo hay uno en el cluster. Regula el acceso a los ficheros por parte
de los clientes. Mantiene en memoria la metadata del sistema de ficheros y control de los
bloques de fichero que tiene cada DataNode.
DataNode (slave): Son los responsables de leer y escribir las peticiones de los clientes. Los
ficheros están formados por bloques, estos se encuentran replicados en diferentes nodos.
MapReduce es un proceso batch, creado para el proceso distribuido de los datos. Permite de una
forma simple, paralelizar trabajo sobre los grandes volúmenes de datos, como combinar web logs
con los datos relacionales de una base de datos para ver como los usuarios interactúan con el
website.
Requerimientos
Para la instalación de Hadoop es necesario contar con una instalación de Java 1.8 o superior, así
como los binarios de Hadoop
Se debe preparar el direccionamiento de las máquinas que van a ser parte del cluster:
Instalación
Instalación de Java: Java es el principal requisito previo para Hadoop. La distribución adecuada se
descarga directamente de la página de Oracle y se sube a los servidores a la carpeta /instaladores,
Hadoop:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
# mkdir /java
# mkdir -p /instaladores/Hadoop
# cd /instaladores/Hadoop
# cp jdk-8u181-linux-x64.tar.gz /java
# cd /java
# tar -zxf jdk-8u181-linux-x64.tar.gz
# rm -Rf jdk-8u181-linux-x64.tar.gz
La asignación de nodos: en cada nodo editamos el archivo /etc/hosts para que cada nodo conozca
el nombre y la dirección de los demás miembros del cluster:
# vi /etc/hosts
10.1.1.249 matvm1 matvm1.utp.edu.co
10.1.1.250 matvm2 matvm2.utp.edu.co
10.1.1.251 matvm3 matvm3.utp.edu.co
10.1.1.252 matvm4 matvm4.utp.edu.co
Creando una cuenta de usuario: se crea una cuenta de usuario en cada una de las máquinas, tanto
maestro como esclavos. Esta cuenta es la encargada de ejecutar el sistema de Hadoop
# groupadd hadoop
# useradd -c "Apache Hadoop" -g hadoop hadoop
# passwd hadoop
# su - hadoop
Agregamos la variable de entorno JAVA_HOME y la agregamos al PATH junto con el path de los
binarios de hadoop
$ vim .bash_profile
JAVA_HOME=/java/jdk1.8.0_181
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin:/opt/hadoop/hadoop/bin:/opt/hadop/hadoop/sbin
export PATH JAVA_HOME
Luego la invocamos de la siguiente forma para que recargue este archivo y verificamos la versión de
java que quedó instalada:
$ . .bash_profile
$ java -version
Configuración basada en una clave de acceso: la comunicación entre el maestro y los esclavos se
realiza por SSH. Para poder tener control de las tareas de ejecución que se lanzan en los nodos
esclavos es necesario configurar las cuentas para que no pidan clave de acceso, para esto debemos
hacer lo siguiente en cada uno de los nodos:
$ ssh-keygen -t rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@matvm1
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@matvm2
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@matvm3
$ ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop@matvm4
$ chmod 0600 ~/.ssh/authorized_keys
$ exit
Instalación de Hadoop
En cada uno de los nodos, descargamos e instalamos Hadoop usando los siguientes comandos:
# mkdir /opt/hadoop
# cd /opt/hadoop/
# wget http://www-eu.apache.org/dist/hadoop/common/hadoop-2.9.1/hadoop-2.9.1.tar.gz
# tar -xzf hadoop-2.9.1.tar.gz
# mv hadoop-2.9.1 hadoop
# chown -R hadoop:hadoop /opt/hadoop
# cd /opt/hadoop/hadoop/
Configuración Hadoop: el siguiente paso es configurar el servicio de Hadoop. Para esto se deben
modificar algunos archivos personalizando algunos parámetros.
vim /opt/hadoop/hadoop/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/java/jdk1.8.0_181
vim /opt/hadoop/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://matvm1:9000/</value>
</property>
</configuration>
vim /opt/hadoop/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop/hadoop/hdfs/namenode</value>
<final>true</final>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/hadoop/hadoop/hdfs/datanode</value>
<final>true</final>
</property>
</configuration>
mkdir -p /opt/hadoop/hadoop/hdfs/namenode
mkdir -p /opt/hadoop/hadoop/hdfs/datanode
chmod 755 /opt/hadoop/hadoop/hdfs/datanode
cp /opt/hadoop/hadoop/etc/hadoop/mapred-site.xml.template
/opt/hadoop/hadoop/etc/hadoop/mapred-site.xml
vim /opt/hadoop/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
vim /opt/hadoop/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>matvm1:8025</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>matvm1:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>matvm1:8050</value>
</property>
<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.nodemanager.disk-health-checker.min-healthy-disks</name>
<value>0</value>
</property>
</configuration>
vim /opt/hadoop/hadoop/etc/hadoop/slaves
10.1.1.250
10.1.1.251
10.1.1.252
Estos archivos se copian a los demás nodos:
mkdir -p /opt/hadoop/hadoop/hdfs/datanode
chmod 755 /opt/hadoop/hadoop/hdfs/datanode
Para verificar que procesos JAVA están ejecutandose se corre el siguiente comando esperado las
siguientes salidas:
NameNode:
$ jps
30612 SecondaryNameNode
30825 Jps
30367 NameNode
DataNode:
$ jps
1220 DataNode
1367 Jps
/opt/hadoop/hadoop/sbin/start-yarn.sh
WordCount.java
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public void map(Object key, Text value, Context context) throws IOException,
InterruptedException
{
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException,
InterruptedException
{
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
Se crea un archivo con palabras que será la entrada del programa y los nodos procesarán dicho
archivo
vim palabras
…
echo $HADOOP_CLASSPATH
/opt/hadoop/hadoop/etc/hadoop:/opt/hadoop/hadoop/share/hadoop/common/lib/*:/opt/hado
op/hadoop/share/hadoop/common/*:/opt/hadoop/hadoop/share/hadoop/hdfs:/opt/hadoop/ha
doop/share/hadoop/hdfs/lib/*:/opt/hadoop/hadoop/share/hadoop/hdfs/*:/opt/hadoop/hadoop
/share/hadoop/yarn:/opt/hadoop/hadoop/share/hadoop/yarn/lib/*:/opt/hadoop/hadoop/share/
hadoop/yarn/*:/opt/hadoop/hadoop/share/hadoop/mapreduce/lib/*:/opt/hadoop/hadoop/shar
e/hadoop/mapreduce/*:/contrib/capacity-scheduler/*.jar
$ mkdir out
$ javac -classpath ${HADOOP_CLASSPATH} -d out WordCount.java
$ jar -cvf conteo.jar -C out/ .
$ hadoop jar conteo.jar WordCount /conteo/input /conteo/output
$ hadoop dfs -cat /conteo/output/*
Ana 2
Andres 3
Angelica 2
Anival 1
Carlos 2
Carolina 2
Fanny 1
Guillermo 1
Jose 3
Juan 3
Luisa 1
Maria 4
Nathalia 1
Pedro 1