Medio ambiente
- JDK 1.8
- Intellij Idea 2018.1
- Hadoop 2.6.0 (Hadoop no está instalado localmente)
- maven 3.5.4
Crear proyecto de conteo de palabras
- Cree un nuevo proyecto maven java en idea (configure maven jdk ligeramente)
Configurar dependencias de pom
- archivo pom.xml
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
-
Crear clase de asignador
package com.lens.task; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; import java.util.StringTokenizer; /** * @author lens * @create 2020-02-25 10:24 */ public class VoteCountMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override protected void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer words = new StringTokenizer(value.toString()); while (words.hasMoreTokens()) { word.set(words.nextToken()); context.write(word, one); } } }
-
Crear clase reductora
package com.lens.task; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; /** * @author lens * @create 2020-02-25 10:24 */ public class VoteCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int count = 0; for (IntWritable value : values) { count += value.get(); } result.set(count); context.write(key, result); } }
-
Crear clase de controlador voteCount
package com.lens.task; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; 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.input.TextInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; /** * @author lens * @create 2020-02-25 10:22 */ public class VoteCount extends Configured implements Tool { public static void main(String[] args) throws Exception { int res = ToolRunner.run(new Configuration(),new VoteCount(),args); System.exit(res); } public int run(String[] args) throws Exception { if (args.length !=2){ System.out.println("Incorrect input, expected: [input] [output]"); System.exit(-1); } Configuration conf = this.getConf(); Job job = new Job(conf, "word count"); job.setJarByClass(VoteCount.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); job.setMapperClass(VoteCountMapper.class); job.setReducerClass(VoteCountReducer.class); job.setInputFormatClass(TextInputFormat.class); job.setOutputValueClass(TextOutputFormat.class); job.setMapOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.submit(); return job.waitForCompletion(true) ? 0 : 1; } }
Nota: Aquí el formato de archivo debe importar el paquete en lib
5. Crear entrada de directorio de entrada de archivo de recuento de palabras. Se cuentan los caracteres del archivo y se genera el resultado del recuento.
Primero, debe configurar la ruta de entrada. Aquí src
, cree una nueva carpeta debajo del proyecto (el directorio en el mismo nivel) input
y agregue uno o más archivos de texto input
(cargados) como ejemplo.
需要注意:File
-> Project Structure
, Seleccione Modules
elementos en el cuadro de diálogo emergente , aquí la input
carpeta está marcada comoExcluded
.
Configurar parámetros operativos
Aquí debe configurar la ruta de entrada entrada salida salida requerida por la clase Main y VoteCount cuando el programa se está ejecutando.
Seleccione- Run
> en la barra de menú de Intellij Edit Configurations
y haga clic en el cuadro de diálogo que aparece para +
crear una nueva Application
configuración. Configure Main class
como recuento de votos (puede hacer clic en la ...
selección de la derecha ), Program arguments
es decir input/ output/
, la ruta de entrada es la input
carpeta creada y la salida esoutput(可以不配)
Corriendo
Una vez completada la configuración, haga clic en la barra de menú- Run
> Run 'VoteCount'
para comenzar a ejecutar el programa MapReduce. Una vez completado el programa, aparecerá una carpeta en la esquina superior izquierda output
, ¡y part-r-00000
el resultado es la operación!
Archivo de entrada
Resultado de la operación