Está en la página 1de 10

Instalación de Hadoop sobre Linux CentOS en 4 nodos

Arquitectura

Apache Hadoop es un framework que permite el procesamiento de grandes volúmenes de datos a


través de clusters, usando un modelo simple de programación. Además, su diseño permite pasar de
pocos nodos a miles de nodos de forma ágil. Hadoop es un sistema distribuido usando una
arquitectura Master-Slave, usando para almacenar su Hadoop Distributed File System (HDFS) y
algoritmos de MapReduce para hacer cálculos.

HDFS es el sistema de almacenamiento, es un sistema de ficheros distribuido. Fue creado a partir


del Google File System (GFS). HDFS se encuentra optimizado para grandes flujos y trabajar con
ficheros grandes en sus lecturas y escrituras. Su diseño reduce las operaciones de entrada/salida en
la red. La escalabilidad y disponibilidad son otras de sus claves, gracias a la replicación de los datos
y tolerancia a los fallos. Los elementos importantes del cluster son:

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

El modelo de MapReduce simplifica el procesamiento en paralelo, abstrayéndonos de la


complejidad que hay en los sistemas distribuidos. Básicamente las funciones Map transforman un
conjunto de datos a un número de pares key/value. Cada uno de estos elementos se encontrará
ordenado por su clave, y la función reduce es usada para combinar los valores (con la misma clave)
en un mismo resultado.
Un programa en MapReduce, se suele conocer como Job, la ejecución de un Job empieza cuando el
cliente manda la configuración de Job al JobTracker, esta configuración especifica las
funciones Map, Combine (shuttle) y Reduce, además de la entrada y salida de los datos.

En las máquinas corren los siguientes demonios:


- HDFS: encargado de administrar el sistema de archivos del cluster
- YARN: en elequipo NameNode cumple la función de “Resource Manager” mientras que en los
equipos DataNode cumple la función de “Node Manager”

En e l presente documento explica la configuración del clúster de 4 nodos Hadoop en un entorno


distribuido.

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:

Hadoop Master: 10.1.1.249 (hadoop-master)


Hadoop Slave1: 10.1.1.250 (hadoop-slave-1)
Hadoop Slave2: 10.1.1.251 (hadoop-slave-2)
Hadoop Slave3: 10.1.1.252 (hadoop-slave-3)

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

En cada uno de los nodos ejecutamos las siguientes instrucciones:

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

El archivo hadoop-env.sh debe modificarse en todas los nodos del cluster

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:

scp core-site.xml mapred-site.xml hdfs-site.xml yarn-site.xml


10.1.1.250:/opt/hadoop/hadoop/etc/hadoop/
scp core-site.xml mapred-site.xml hdfs-site.xml yarn-site.xml
10.1.1.251:/opt/hadoop/hadoop/etc/hadoop/
scp core-site.xml mapred-site.xml hdfs-site.xml yarn-site.xml
10.1.1.252:/opt/hadoop/hadoop/etc/hadoop/

Se crea la estructura de directorios en los nodos esclavos:

mkdir -p /opt/hadoop/hadoop/hdfs/datanode
chmod 755 /opt/hadoop/hadoop/hdfs/datanode

En el nodo maestro se formatea el directorio maestro que pertenecen a HDFS e iniciamos


lasinstancias en todos los nodos del cluster

hdfs namenode -format


/opt/hadoop/hadoop/sbin/start-dfs.sh

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

En el nodo maestro iniciamos los procesos de YARN:

/opt/hadoop/hadoop/sbin/start-yarn.sh

Una vez se sube el servivio se puede ir a la dirección http://10.1.1.249:50070 para administrar el


servicio de HDFS
También se puede ir a la dirección http://10.1.1.249:8088 para administrar hadoop.
Ejemplo: conteo de palabras

Para el siguiente ejemplo se debe crear la siguiente clase en Java

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 class WordCount {

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>


{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();

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 static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable>


{
private IntWritable result = new IntWritable();

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);
}
}

public static void main(String[] args) throws Exception {


Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

Se crea un archivo con palabras que será la entrada del programa y los nodos procesarán dicho
archivo

vim palabras

export HADOOP_CLASSPATH=$(hadoop classpath)

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

hadoop fs -mkdir /conteo2


hadoop fs -mkdir /conteo2/input
hadoop fs -put palabras /conteo/input
hadoop fs -ls /conteo/input
Found 1 items
-rw-r--r-- 3 hadoop supergroup 178 2018-09-19 16:44 /conteo/input/palabras

$ 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

También podría gustarte