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
- 2. Usa la idea para crear un proyecto experto
- 3. Modifique el contenido del archivo.
- 4. Establecer archivos de entrada y salida
- 5. Pantalla de efectos
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.
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.
Descargue los archivos relevantes de Hadoop en Windows
https://github.com/cdarlint/winutils
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.
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 version
vea el siguiente contenido para indicar que la configuración es exitosa!
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.
La nueva estructura del directorio
Main.java
MapperTest.java
ReducerTest.java
log4j.properties
es la siguiente
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
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.
Guarde esta configuración en ejecución.
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)
después de que la configuración sea exitosa, haga clic en Aceptar, puede ejecutar