Clúster HDFS
El clúster HDFS está construido sobre el clúster Hadoop. Dado que HDFS es el proceso demonio principal de Hadoop , el proceso de configuración del clúster HDFS es el representante del proceso de configuración del clúster Hadoop.
El uso de Docker puede crear un entorno de clúster de manera más conveniente y eficiente.
Configuración en cada ordenador
¿Cómo configura Hadoop los clústeres y qué configuraciones debería haber en diferentes computadoras?
El control remoto del nodo de nombres HDFS al nodo de datos se realiza a través de SSH , por lo que los elementos de configuración clave deben configurarse en el nodo de nombres y la configuración del nodo no crítico debe configurarse en cada nodo de datos. Es decir, las configuraciones de los nodos de datos y los nodos de nombres pueden ser diferentes, y las configuraciones de diferentes nodos de datos también pueden ser diferentes.
Para facilitar el establecimiento de un clúster, utilizo el mismo archivo de configuración para sincronizar todos los nodos del clúster en forma de una imagen de Docker.
Pasos específicos
La idea general es: primero usar una imagen reflejada que contenga Hadoop para configurarlo de modo que todos los nodos del clúster puedan compartirlo, y luego usarlo como prototipo para generar varios contenedores para formar un clúster.
prototipo de configuración
Primero, use la imagen hadoop_proto previamente preparada para comenzar como contenedor:
docker run -d --name=hadoop_temp --privileged hadoop_proto /usr/sbin/init
Ingrese al directorio del archivo de configuración de Hadoop:
cd $HADOOP_HOME/etc/hadoop
documento | efecto |
---|---|
trabajadores | Registre el nombre de host o la dirección IP de todos los nodos de datos |
sitio-core.xml | Configuración central de Hadoop |
hdfs-sitio.xml | Elementos de configuración de HDFS |
sitio-mapred.xml | Elementos de configuración de MapReduce |
sitio-hilado.xml | Elementos de configuración de hilo |
Una vez configurado el prototipo del clúster, salga del contenedor y cárguelo en la nueva imagen cluster_proto:
docker stop hadoop_temp
docker commit hadoop_temp cluster_proto
implementar clúster
Primero, cree la red privada hnet para el clúster de Hadoop:
docker network create --subnet=172.20.0.0/16 hnet
Luego cree el contenedor del clúster:
docker run -d --name=nn --hostname=nn --network=hnet --ip=172.20.1.0 --add-host=dn1:172.20.1.1 --add-host=dn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --name=dn1 --hostname=dn1 --network=hnet --ip=172.20.1.1 --add-host=nn:172.20.1.0 --add-host=dn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --name=dn2 --hostname=dn2 --network=hnet --ip=172.20.1.2 --add-host=nn:172.20.1.0 --add-host=dn1:172.20.1.1 --privileged cluster_proto /usr/sbin/init
Ingrese el nodo nombrado:
docker exec -it nn su hadoop
Formato HDFS:
hdfs namenode -format
Si nada sale mal, el siguiente paso es iniciar HDFS:
start-dfs.sh
Después de un inicio exitoso, el comando jps debería poder verificar la existencia de NameNode y SecondaryNameNode. El proceso DataNode no existe para los nodos nombrados porque este proceso se ejecuta en dn1 y dn2.
Usos de MapReduce
Word Count es "recuento de palabras", que es el más clásico de los programas de trabajo de MapReduce. Su tarea principal es realizar estadísticas inductivas sobre las palabras de un archivo de texto y contar el número total de apariciones de cada palabra que ha aparecido.
Hadoop incluye muchos programas de muestra clásicos de MapReduce, incluido Word Count.
Nota: Este caso aún se puede ejecutar cuando HDFS no se está ejecutando, así que primero probémoslo en modo independiente.
Primero, inicie un nuevo contenedor de la imagen hadoop_proto creada previamente:
docker run -d --name=word_count hadoop_proto
en el contenedor:
docker exec -it word_count bash
Ingrese al directorio INICIO:
cd ~
Ahora preparamos un archivo de texto input.txt:
I love China
I like China
I love hadoop
I like hadoop
Guarde el contenido anterior con un editor de texto.
Ejecute MapReduce:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount input.txt output
Explica el significado:
El jar de hadoop ejecuta el trabajo MapReduce desde el archivo jar, seguido de la ruta al paquete de ejemplo.
wordcount significa ejecutar el programa Word Count en el paquete de muestra, seguido de estos dos parámetros, el primero es el archivo de entrada y el segundo es el nombre del directorio del resultado de salida (porque el resultado de salida son varios archivos).
Después de la ejecución, se debe generar una salida de carpeta, y hay dos archivos en esta carpeta: _SUCCESS y part-r-00000.
modo de clúster
Ahora ejecutamos MapReduce en modo clúster.
Inicie el contenedor de clúster configurado en el capítulo anterior:
docker start nn dn1 dn2
Ingrese al contenedor NameNode:
docker exec -it nn su hadoop
Ir a casa:
cd ~
Editar entrada.txt:
I love China
I like China
I love hadoop
I like hadoop
Inicie HDFS:
start-dfs.sh
Crea un directorio:
hadoop fs -mkdir /wordcount
hadoop fs -mkdir /wordcount/input
Subir entrada.txt
hadoop fs -put input.txt /wordcount/input/
Ejecutar recuento de palabras:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount /wordcount/input /wordcount/output
Ver resultados de ejecución:
hadoop fs -cat /wordcount/output/part-r-00000
Si todo está bien, se mostrarán los siguientes resultados:
I 4
hadoop 2
like 2
love 2
China 2
Programación MapReduce
Después de aprender a usar MapReduce, ya podrá manejar tareas estadísticas y de recuperación como Word Count, pero objetivamente, todavía hay muchas cosas que MapReduce puede hacer.
MapReduce depende principalmente de los desarrolladores para implementar funciones a través de la programación, y los desarrolladores pueden procesar datos implementando métodos relacionados con Map y Reduce.
Para demostrar este proceso de forma sencilla, escribimos manualmente un programa de recuento de palabras.
Nota: MapReduce depende de la biblioteca de Hadoop, pero el entorno de ejecución de Hadoop que uso es un contenedor Docker, por lo que es difícil implementar un entorno de desarrollo, por lo que el trabajo de desarrollo real (incluida la depuración) requerirá una computadora que ejecute Hadoop.
Código del archivo MyWordCount.java
/**
* 引用声明
* 本程序引用自 http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html
*/
package com.runoob.hadoop;
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
/**
* 与 `Map` 相关的方法
*/
class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key,
Text value,
OutputCollector<Text, IntWritable> output,
Reporter reporter)
throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}
/**
* 与 `Reduce` 相关的方法
*/
class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key,
Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output,
Reporter reporter)
throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
public class MyWordCount {
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(MyWordCount.class);
conf.setJobName("my_word_count");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
// 第一个参数表示输入
FileInputFormat.setInputPaths(conf, new Path(args[0]));
// 第二个输入参数表示输出
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
}
Guarde el contenido de este archivo Java en el contenedor NameNode, ubicación sugerida:
/home/hadoop/MyWordCount/com/runoob/hadoop/MyWordCount.java
Nota: De acuerdo con la situación actual, el JDK instalado en algunos entornos Docker no admite chino, por lo que, para estar seguro, elimine los comentarios en chino en el código anterior.
Ingrese al directorio:
cd /home/hadoop/MyWordCount
Compilar:
javac -classpath ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.1.4.jar -classpath ${HADOOP_HOME}/share/hadoop/client/hadoop-client-api-3.1.4.jar com/runoob/hadoop/MyWordCount.java
Embalar:
jar -cf my-word-count.jar com
implementar:
hadoop jar my-word-count.jar com.runoob.hadoop.MyWordCount /wordcount/input /wordcount/output2
Ver resultados:
hadoop fs -cat /wordcount/output2/part-00000
producción:
I 4
hadoop 2
like 2
love 2
China 2