Puede usar un ejemplo simple para ilustrar qué es MapReduce:
Queremos contar el número de veces que cada palabra aparece en un archivo grande. Porque el archivo es demasiado grande. Dividamos este archivo en archivos pequeños y luego organizamos a varias personas para contar. Este proceso es "mapa". Luego fusione los números contados por cada persona, y esto es "reducir".
Si realiza el ejemplo anterior en MapReduce, debe crear un trabajo de tarea, que divide el archivo en varios bloques de datos independientes y lo distribuya en diferentes nodos de la máquina. Luego proceselo de manera completamente paralela a través de tareas de mapas dispersas en diferentes nodos. MapReduce recopilará las líneas de salida del mapa y luego enviará la salida de resultados para reducir el siguiente paso de procesamiento.
Para el proceso de ejecución específico de una tarea, habrá un proceso llamado "JobTracker" responsable de coordinar todas las tareas en el proceso de ejecución de MapReduce. Varios procesos de Tasktracker se utilizan para ejecutar tareas de mapa separadas e informar la ejecución de la tarea a JobTracker en cualquier momento. Si un TaskTracker informa una tarea o no informa su propia tarea durante mucho tiempo, JobTracker iniciará otro TaskTracker para volver a ejecutar una tarea de mapa por separado.
(1) Cree un proyecto Maven relacionado en Eclipse, confiando en el paquete JAR de la siguiente manera (también puede consultar la configuración de POM del proyecto Hadoop-Mapreduce-Examples en el paquete de código fuente de Hadoop)
Nota: Para configurar un complemento Maven Maven-Jar-Plugin y especificar MainClass
<pendencies> <Spendency> <MoupRId> Junit </Groupid> <StarifactId> Junit </artifactid> <versión> 4.11 </versewers> </pendency> <pendency> <proupid> org.apache.hadoop </groupid> <artifactid> hadoop-mapreduceduce-client-core </artifactid> <verseversion> <MoupRid> org.apache.hadoop </groupid> <artifactid> hadoop-common </artifactid> <versión> 2.5.2 </versión> </pendency> </dependencias> <lugins> <glugins> <glugin> <proupid> org.apache.maven.plugins </groupid> <artifactid> mifactiD> </artustring </artusurtu <Achive> <Manifest> <Mainclass> com.xxx.demo.hadoop.wordcount.wordcount </inclass> </chestest> </archive> </figuration> </glugin> </glugins> </build>
(2) Según el mecanismo de operación de MapReduce, un trabajo debe escribir al menos tres clases para completar las tres cosas: lógica de mapas, reducir la lógica y la programación de trabajo.
El código del mapa puede heredar org.apache.hadoop.mapreduce.mapper clase
public static class tokenizermapper extiende mapper <objeto, texto, texto, intwritable> {private final static intwritable one = new intwritable (1); Palabra de texto privado = nuevo texto (); // Dado que este ejemplo no usa el parámetro clave, el tipo de clave se especifica simplemente como objeto public void map (clave de objeto, valor de texto, contexto context) lanza ioexception, interruptedException {stringTokenizer itr = new StringTokenizer (value.ToString ()); while (itr.hasmoretokens ()) {word.set (itr.nextToken ()); context.write (palabra, uno); }}}El código de Reduce puede heredar org.apache.hadoop.mapreduce.educer clase
Public Class Intsumeducer extiende Reducer <Text, Intwritable, Text, Intwritable> {private intwritable resultado = new intwritable (); Public void Reduce (clave de texto, iterable <intwritable> valores, contexto de contexto) arroja ioexception, interruptedException {int sum = 0; for (intwritable val: valores) {sum += val.get (); } resultado.set (suma); context.write (clave, resultado); }}Escriba el método principal para la programación de trabajo
public static void main (string [] args) lanza la excepción {Configuración conf = nueva configuración (); Trabajo trabajo = trabajo.getInstance (conf, "Recuento de palabras"); Job.SetJarbyClass (WordCount.Class); Job.SetMapperClass (tokenizermapper.class); Job.SetCombinLass (intsumeducer.class); Job.SetEducerClass (intsumeducer.class); Job.SetOutputKeyClass (text.class); Job.SetOutputValuecLass (intwritable.class); Fileinputformat.addinputPath (trabajo, nueva ruta (args [0])); FileOutputFormat.setOutputPath (trabajo, nueva ruta (args [1])); Job.WaitForCompletion (verdadero); //System.exit(job.WaitForCompletion(true)? 0: 1); }Ejecute MVN Instalar para escribir el proyecto en un archivo JAR y cárguelo en el entorno de clúster de Linux. Use el comando HDFS DFS -MKDIR para crear el comando correspondiente en el sistema de archivos HDFS. Use HDFS DFS -put para cargar los archivos de datos que deben procesarse al sistema HDFS. Ejemplo: HDFS DFS -put $ {Linux_Path/Data File} $ {hdfs_path}
Ejecute el comando en un entorno de clúster: hadoop jar $ {linux_path} /wordcount.jar $ {hdfs_input_path} $ {hdfs_output_path}
HDFS DFS -CAT $ {HDFS_OUTPUT_PATH}/Nombre del archivo de salida
El método anterior se ejecuta en modo local cuando no se inicia el entorno de clúster Hadoop. En este momento, ni los HDF ni el hilo funcionan. El siguiente es el trabajo que debe hacer al ejecutar el trabajo MapReduce en modo pseudo-distribuido. Primero, extracto de los pasos que figuran en el sitio web oficial:
Configurar el nombre de host
# vi /etc/sysconfig/network
Por ejemplo:
Networking = yeshostName = MasterVi /etc /hosts
Complete el siguiente contenido
127.0.0.1 localhost
Configurar SSH sin intercomunicación de contraseña
ssh-keygen -t rsa
# cat?~/.ssh/id_rsa.pub?>>?~/.ssh/authorized_keys
Configure el archivo Core-Site.xml (ubicado en $ {hadoop_home}/etc/hadoop/
<Configuration> <property> <name> fs.defaultfs </name> <value> hdfs: // localhost: 9000 </value> </property> </configuration>
Configurar el archivo hdfs-site.xml
<Configuration> <property> <name> dfs.replication </name> <alue> 1 </value> </property> </figuration>
El siguiente comando puede ejecutar el trabajo MapReduce en el modo de pseudodistribución independiente
1.Formaten el sistema de archivos:
$ bin/hdfs namenode -format
2. Iniciar Daemon de Daemon y Datanode NameNode:
$ sbin/start-dfs.sh
3. La salida del registro de demonio de Hadoop se escribe en el directorio $ hadoop_log_dir (predeterminado a $ hadoop_home/logs).4.Browse la interfaz web para el NameNode; Por defecto está disponible en:
Namenode - http: // localhost: 50070/
Requerir los directorios HDFS necesarios para ejecutar trabajos de MapReduce:
$ bin /hdfs dfs -mkdir /usuario
$ bin/hdfs dfs -mkdir/user/<sserername>
5. Copia los archivos de entrada en el sistema de archivos distribuidos:
$ bin/hdfs dfs -put etc/hadoop Entrada
6. Rungue algunos de los ejemplos proporcionados:
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-pruebas de 2.5.2.Jar GREP Output 'DFS [AZ.]+'
7. Examine los archivos de salida:
Copie los archivos de salida del sistema de archivos distribuido al sistema de archivos local y examínelos:$ bin/hdfs dfs -get salida de salida
$ CAT SALIDA/*
oVer los archivos de salida en el sistema de archivos distribuidos:
$ bin/hdfs dfs -cat salida/*
8. Cuando termines, detenga a los demonios con:
$ sbin/stop-dfs.sh
Lo anterior es todo el contenido del código de instancia de WordCount en este artículo, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!