3.2 Hadoop-MapReduce,统计词数

统计文件中的各个词出现的次数

jar包直接上传服务器上运行直接打src下的代码:

hadoop jar MapReduce.jar com.test.mapreduce.RunJob 直接在服务器上执行jar包相对于的类

项目中的org.apache.*包和core-site.xml和hdfs-site.xml是方便本地eclipse上运行测试
项目结构:

CountMapper:
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;/**
 * 定义Map任务和输出类型
 * LongWritable 按下标输出
 * Text 读取数据类型
 * Text key值类型
 * IntWritable value值类型
 * @author root
 *
 */
public class CountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

 /** map方法是一行数据调用一次。每一次调用传入一行数据。该行数据的下标位为key。内容为value
  * LongWritable 输出下标
  * value 读取的数据
  * context 内容组合
  */
 protected void map(LongWritable key, Text value,Context context)
   throws IOException, InterruptedException {
  String[] str = value.toString().split(" ");//字符按空格切割
  for (int i = 0; i < str.length; i++) {
   String string = str[i];//获取当前字符
   Text outkey = new Text(string);//字符变成Text类型
   IntWritable outvalue = new IntWritable(1);//定义出现次数value
   context.write(outkey, outvalue);//key ,value组合
  }
 }

}
————————————————————————————————————————————————————————————————————————————
CountReducer:
import java.io.IOException;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Reducer;/**
 * Text 对应Mapper的key输出类型
 * IntWritable 对应Mapper的value输入类型
 * Text 对应自己定义的输出key类型
 * IntWritable 对应自己定义的输出value类型
 * @author oot
 *
 */
public class CountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
 /**
  * 该方法每一组调用一次。
  * key 改组的key数据
  * arg1 value数组
  */
 protected void reduce(Text key, Iterable<IntWritable> arg1,Context arg2)
   throws IOException, InterruptedException {
  int num=0;
  for (IntWritable intWritable : arg1) {
   num = num+intWritable.get();//计算该key出现的次数累加
  }
  arg2.write(key, new IntWritable(num));//计算之后重新组合key value
 }

}
————————————————————————————————————————————————————————————————————————
RunJob:
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 RunJob {
 
 public static void main(String[] args) {
  Configuration conf = new Configuration();//连接HDFS
  conf.set("fs.defaultFS", "hdfs://node1:9000"); //该处直接指定HDFS服务器,要是jar到服务器上运行,注释掉该行
  try {
   FileSystem fs = FileSystem.get(conf); //定义HDFS
   Job job = Job.getInstance(conf); //定义MapReduce
   job.setJobName("testMapReduce");//定义这个任务的名称
   job.setJarByClass(RunJob.class);//job的入口类
   
   job.setMapperClass(CountMapper.class);//输入Mapper类
   job.setReducerClass(CountReducer.class);//输入Reducer类
   
   job.setOutputKeyClass(Text.class);//设置输出的key类型
   job.setOutputValueClass(IntWritable.class);//设置输出的value类型
   
   //定义job任务输入数据目录和输出结果目录
   //把wc.txt上传到hdfs目录中/usr/intput/wc.txt
   //输出结果数据放到/usr/output/wc
   FileInputFormat.addInputPath(job, new Path("/usr/input/wc.txt")); //HDFS上的目录,不是服务器上的目录
   Path outpath = new Path("/usr/output/wc");
   //输出结果数据目录不能存在,job执行时自动创建的。如果在执行时目录已经存在,则job执行失败
   if(fs.exists(outpath)){//验证是否有该文件夹,有就删除 true是递归删除
    fs.delete(outpath,true);
   }
   FileOutputFormat.setOutputPath(job, outpath);//按规则输出到相应路径
   
   boolean f = job.waitForCompletion(true);
   if(f){
    System.out.println("Job执行成功");
   }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

猜你喜欢

转载自blog.csdn.net/u011418530/article/details/80360876
3.2