Resumen de Hadoop (abajo)

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

Supongo que te gusta

Origin blog.csdn.net/weixin_44659309/article/details/132394618
Recomendado
Clasificación