WordCount de Hadoop manuscrito a partir de 0 (versión Idea)

Este artículo comenzará con la descarga e instalación de Hadoop, escriba el código y ejecute su primer programa MapReduce: WordCount. La plataforma experimental es Windows.

Tabla de contenido


1. Descarga e instalación de Hadoop

Enlace de descarga: https://hadoop.apache.org/releases.html

Seleccione la versión que desee y luego haga clic en Binario para descargar.
Inserte la descripción de la imagen aquí
El editor utiliza la versión 3.2.1 de soporte a largo plazo, haga clic en [haga clic para entrar, habrá un enlace de descarga, haga clic en descargar. Lo que se descarga es un archivo comprimido de .tar.gz, y necesitamos descomprimirlo.


Inserte la descripción de la imagen aquí
Descargue los archivos relevantes de Hadoop en Windows
https://github.com/cdarlint/winutils
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Descargue los dos archivos anteriores y colóquelos E:\hadoop-3.2.1\bin, donde `ʻE: \ hadoop-3.2.1` es el directorio de descompresión de hadoop


Después de eso está la configuración de variables de entorno.

Inserte la descripción de la imagen aquí
ps : otra configuración de variable de entorno opcional, no utilizada en este experimento

nombre de la variable Valor / Valor agregado
LD_LIBRARY_PATH % HADOOP_HOME% \ lib \ native
CAMINO Adición% HADOOP_HOME% \ sbin

Verificación
Ingrese cmd y hadoop versionvea el siguiente contenido para indicar que la configuración es exitosa! Inserte la descripción de la imagen aquí
Nota : Si encuentra que Hadoop no puede reconocer su nombre de usuario, puede considerar crear un nuevo usuario para ejecutar este comando.


2. Utilice la idea para crear un proyecto experto.

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
La nueva estructura del directorio
Main.java
MapperTest.java
ReducerTest.java
log4j.properties
es la siguiente
Inserte la descripción de la imagen aquí

3. Modifique el contenido del archivo.

3.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>org.example</groupId>
   <artifactId>hadoop-wordcount</artifactId>
   <version>1.0-SNAPSHOT</version>

   <properties>
   	<!-- 这里填写的是你的jdk的版本 -->
       <maven.compiler.target>11</maven.compiler.target>
       <maven.compiler.source>11</maven.compiler.source>
   </properties>

   <dependencies>
       <dependency>
           <groupId>log4j</groupId>
           <artifactId>log4j</artifactId>
           <version>1.2.17</version>
       </dependency>
       <!-- 要注意3.2.1是我下载hadoop的版本,这个版本号要和hadoop对应 -->
       <dependency>
           <groupId>org.apache.hadoop</groupId>
           <artifactId>hadoop-client</artifactId>
           <version>3.2.1</version>
       </dependency>
       <dependency>
           <groupId>org.apache.hadoop</groupId>
           <artifactId>hadoop-common</artifactId>
           <version>3.2.1</version>
       </dependency>
       <dependency>
           <groupId>org.apache.hadoop</groupId>
           <artifactId>hadoop-hdfs</artifactId>
           <version>3.2.1</version>
       </dependency>
   </dependencies>
   <build>
       <finalName>hadoop_word_count</finalName>
       <plugins>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-shade-plugin</artifactId>
               <version>3.2.0</version>
               <executions>
                   <execution>
                       <phase>package</phase>
                       <goals>
                           <goal>shade</goal>
                       </goals>
                       <configuration>
                           <transformers>
                               <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                   <mainClass>wordconunt.Main</mainClass>
                               </transformer>
                           </transformers>
                       </configuration>
                   </execution>
               </executions>
           </plugin>
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <configuration>
               	<!-- 这里填写的是你的jdk的版本 -->
                   <source>11</source>
                   <target>11</target>
               </configuration>
           </plugin>
       </plugins>
   </build>
</project>

3.2 Main.java

package wordconunt;

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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class Main {
    
    
    public static void main(String[] args) throws IOException,
            IllegalArgumentException, ClassCastException, ClassNotFoundException, InterruptedException {
    
    
        // 加载配置类
        Configuration conf = new Configuration();

        // 获取Job对象
        Job job = Job.getInstance();

        // 设置jar存储的位置
        job.setJarByClass(Main.class);

        // 关联Mapper 和 reducer
        job.setMapperClass(MapperTest.class);
        job.setReducerClass(ReducerTest.class);

        // 设置Mapper输出阶段的数据键值的类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        // 设置最终输出阶段的数据键值的类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        // 设置输出和输入路径
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        //提交job
        boolean res = job.waitForCompletion(true);
        System.exit(res?0:1);
    }
}

3.3 MapperTest.java

package wordconunt;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class MapperTest extends Mapper<LongWritable, Text, Text, IntWritable> {
    
    
   Text wordText = new Text();
   IntWritable outValue = new IntWritable(1);

   @Override
   protected void map(LongWritable key, Text value, Mapper.Context context)
           throws IOException, InterruptedException {
    
    
       // 读取一行
       String line = value.toString();
       // 安装空格进分词
       String[] words = line.split(" ");//分词
       // 遍历每一个词
       for(String word : words) {
    
    
           wordText.set(word);
           //写出
           context.write(wordText, outValue);
       }
   }
}

3.4 ReducerTest.java

package wordconunt;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;


public class ReducerTest extends Reducer<Text, IntWritable, Text, IntWritable> {
    
    
   /**
    * key 输入的 键
    * value 输入的 值
    * context 上下文对象,用于输出键值对
    */
   @Override
   protected void reduce(Text key, Iterable<IntWritable> value,
                         Context context) throws IOException, InterruptedException {
    
    

       int sum=0;
       // 1 . 累计求和
       for (IntWritable number : value) {
    
    
           sum += number.get();
       }
       // 2 . 写出
       context.write(key, new IntWritable(sum));
   }
}

3.5 log4j.properties

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= [%d{
    
    yyyy-MM-dd HH:mm}]:%p %l%m%n


#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.debug.File=./log/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{
    
    yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n

4. Establecer archivos de entrada y salida

4.1 Cree una nueva carpeta de entrada y cree un nuevo archivo en ella, ingrese algunas palabras (de la siguiente manera, el editor creó una nueva carpeta de entrada en su unidad E como entrada y creó un archivo llamado "in" en ella , Ingresó el siguiente contenido.

123 123
asd aa
123 hadoop
hdfs hdfs
name

Inserte la descripción de la imagen aquí
4.2 Establecer las variables de salida de salida.
Haga clic en el triángulo verde para ejecutar, la consola mostrará un error aquí, no se preocupe, solo obtenga la configuración del tiempo de ejecución.
Inserte la descripción de la imagen aquí
Guarde esta configuración en ejecución.
Inserte la descripción de la imagen aquí
Edite después de guardar, escriba la ruta de la carpeta de entrada y la ruta de la carpeta de salida en los parámetros del programa ( nota : la ruta de salida aquí es una ruta de carpeta inexistente)
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
después de que la configuración sea exitosa, haga clic en Aceptar, puede ejecutar
Inserte la descripción de la imagen aquí

5. Pantalla de efectos

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_49736959/article/details/109128886
Recomendado
Clasificación