Estadísticas de frecuencia de palabras del modo operativo MapReduce

1. Modo de operación local
1. Estructura principal del proyecto:

Inserte la descripción de la imagen aquí

2. Configure pom.xml para importar los paquetes jar necesarios
<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>com.itcast</groupId>
  <artifactId>HadoopDemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <dependencies>
  	<dependency>
  		<groupId>org.apache.hadoop</groupId>
  		<artifactId>hadoop-common</artifactId>
  		<version>2.7.4</version>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.hadoop</groupId>
  		<artifactId>hadoop-hdfs</artifactId>
  		<version>2.7.4</version>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.hadoop</groupId>
  		<artifactId>hadoop-client</artifactId>
  		<version>2.7.4</version>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.hadoop</groupId>
  		<artifactId>hadoop-mapreduce-client-core</artifactId>
  		<version>2.7.4</version>
  	</dependency>
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>RELEASE</version>
  	</dependency>
  	        <dependency>
            <groupId>jdk.tools</groupId>
            <artifactId>jdk.tools</artifactId>
            <version>1.8</version>
            <scope>system</scope>
            <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
        </dependency>
  </dependencies>
  
</project>
3. Proceso de mapeo
package com.mr.wordcount;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
//                                          k1            v1    k2    v2
public class WordCountMapper extends Mapper<LongWritable,Text,Text,IntWritable>{
	private Text k=new Text();
	private static final IntWritable v=new IntWritable(1);
	@Override
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		String[] str = value.toString().split(" ");  //将字符串分片
		for(String temp : str){
			k.set(temp);
			context.write(k,v);
	}
		
	}
	
}

4. Reduce el proceso
package com.mr.wordcount;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
//                                             k2     v2       k3    v3
public class WordCountReduce extends Reducer<Text,IntWritable,Text,Text>{
	//private IntWritable v=new IntWritable();//输出数字,,,,,,<Hello,3>
	private Text v=new Text();  //输出文本,,,<Hello,<1,1,1>>
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,
			Reducer<Text, IntWritable, Text, Text>.Context context) throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		//输入:<Hello,1>,<world,1>,<Hello,1>,<Hello,1> map阶段的,经过shuffle(洗牌)后
		//输出:<Hello,<1,1,1>>,<World,1> Reduce阶段的输入
		
		
		//输出数字,,,,,,<Hello,3>
		/*
		int sum=0;
		//1+1+1
		for(IntWritable temp:value){
			sum=sum+temp.get();
		}
		//输出k3,v3
		v.set(sum);
		context.write(key, v);*/

		
		//输出<Hello,<1,1,1>>,不用求和,需要把上面的 v3 改为Text字符串类型
		 String str="";
		 for(IntWritable value:values){
			 str=str+value;
		 }
		 v.set(str);
		 context.write(key,v);
	}
}

El resultado final del archivo exitoso es:
Inserte la descripción de la imagen aquí

5. Conductor principal:
package com.mr.wordcount;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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;



public class WordCountDriver {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Configuration conf=new Configuration();
		
		//什么也不写,,,默认本地运行
		//在集群中运行,需要配置一下
		conf.set("fs.defaultFS","hdfs://hadoop01:9000"); 
		
		FileSystem fs=FileSystem.get(conf);//设置文件系统
		
		Job job=Job.getInstance(conf);
		
		//设置Mapper和Reduce
		job.setJarByClass(WordCountDriver.class);
		job.setMapperClass(WordCountMapper.class);
		job.setReducerClass(WordCountReduce.class);
		
		//设置输出文件个数,设置为0,没有reduce输出文件
		//job.setNumReduceTasks(0);
		
		//设置map阶段的输出类型(在这个例子中这两句可以注释掉)
		job.setMapOutputKeyClass(Text.class);//k2
		job.setMapOutputValueClass(IntWritable.class);//v2
		
		//设置最终结果输出类型
		job.setOutputKeyClass(Text.class);//k3
		//job.setOutputValueClass(IntWritable.class);//v3
		//输出文本,类型也要修改,,,,<Hello,<1,1,1>>
		job.setOutputValueClass(Text.class);//v3
		
		//==========================在windows里
		/*
		//设置输入输出的目录
		FileInputFormat.setInputPaths(job, "E:\\applications\\eclipse\\workspace\\wordcount\\input");
		//设置输出路径,如果有文件就删除
		Path dst=new Path("E:\\applications\\eclipse\\workspace\\wordcount\\output");
		if(fs.exists(dst)){
			fs.delete(dst,true);
		}
		FileOutputFormat.setOutputPath(job, dst);
		job.waitForCompletion(true);*/
		
		//=========================在集群中
		///*
		//设置输入输出的目录
		FileInputFormat.setInputPaths(job, "/mr/wordcount/input");
		//设置输出路径,如果有文件就删除
		Path dst=new Path("/mr/wordcount/output");
		if(fs.exists(dst)){
			fs.delete(dst,true);
		}
		FileOutputFormat.setOutputPath(job, dst);
		
		//在集群中运行,运行路径不能用\\,必须用/
		
		//提交job
		job.waitForCompletion(true);//*/
	}

}

Abra el clúster y cargue el archivo en la entrada al directorio de datos al construir el clúster:
Inserte la descripción de la imagen aquí
cargue el archivo en el directorio de datos:
Inserte la descripción de la imagen aquí
después de ejecutar como- "ejecutar en hadoop" en jeclipse, puede encontrar problemas de permisos, modificar los permisos Seguridad)
Inserte la descripción de la imagen aquí
Entonces el directorio de salida aparecerá en la ruta de salida de la ejecución: lo
siguiente indica éxito
Inserte la descripción de la imagen aquí

Resumen:
Modo de operación local y modo de operación de clúster:

  • conf.set ("fs.defaultFS", "hdfs: // hadoop01: 9000"); agregue esta oración para ejecutarla en el clúster, el valor predeterminado es local
  • Al agregar una ruta de archivo en el clúster, en lugar de \\, use /
  • Pero lo anterior no es una operación de clúster real, el modo de operación de clúster real: programa MapReduce en un paquete jar, enviado al clúster de hilo para ejecutar la tarea
En segundo lugar, el modo de operación del clúster:
1. El proyecto de empaque es un paquete jar

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Siempre se sabe que lo siguiente está hecho.

2. Cargue el paquete jar del proyecto empaquetado en el directorio de datos

Inserte la descripción de la imagen aquí

3. Ejecute el paquete jar del proyecto

Los parámetros son necesarios detrás del hadoop jar. Si ejecuta el paquete jar directamente, se le indicará que no se especifican parámetros. Como se mencionará más adelante, aquí especificamos directamente la clase principal en el paquete jar (escrito como: nombre del paquete + nombre de la clase)
Inserte la descripción de la imagen aquí
. Al ver el aviso de la operación del proyecto, también puede ver el progreso del proceso de Mapa y el proceso de Reducción:
Inserte la descripción de la imagen aquí
aquí, este es el modo de operación del clúster real.

Publicado 72 artículos originales · elogiado 3 · visitas 3547

Supongo que te gusta

Origin blog.csdn.net/id__39/article/details/105092383
Recomendado
Clasificación