在Hadoop平台MapReduce上运行WordCount

package com.atguigu.mr.wordcount;

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;

/**

  • WordCountMapper类: 需要继承Hadoop的Mapper类.并且指定输入和输出的kv类型,再实现map方法.
  • 待分析的数据:
  • atguigu atguigu
  • ss ss
  • cls cls
  • jiao
  • banzhang
  • xue
  • hadoop
  • 输入的kv:
  • KEYIN: LongWritable 表示读取文件的偏移量(简单理解为文件读取到的位置或者下次从哪个位置开始读取)
  • VALUEIN: Text 表示实际读取到的一行内容
  • 输出的kv:
  • KEYOUT: Text 表示一个单词
  • VALUEOUT: IntWritable 表示这个单词出现了1次

*/
public class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable> {

//输出的key
Text k = new Text();
//输出的value
IntWritable v = new IntWritable(1);
/**
 *
 * @param key       输入的key
 * @param value     输入的value
 * @param context   负责数据的输出(其实负责整个Mapper类中执行过程的调度)
 *
 * map方法的执行过程: 对输入的一个kv对执行一次.
 *
 */
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    //1. 先获取一行内容    atguigu atguigu
    String line = value.toString();
    //2. 按照分隔符切割一行内容  [atguigu,atguigu]
    String[] splits = line.split(" ");
    //3. 迭代数组,将数组中的每个单词都拼成kv写出
    for (String word : splits) {
        //封装key
        k.set(word);

        //将当前的kv 写出
        context.write(k,v);
    }
}

}

=============================================================================
package com.atguigu.mr.wordcount;

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

import java.io.IOException;

/**

  • WordCountReducer类: 需要继承hadoop提供的Reducer类,并指定输入和输出的kv,再实现reduce方法.

  • 输入的kv: 对应的是mapper输出的kv类型。

  • KEYIN: Text

  • VALUEIN: IntWritable

  • 输出的kv:

  • KEYOUT: Text

  • VALUEOUT: IntWritable
    */
    public class WordCountReducer extends Reducer<Text, IntWritable,Text,IntWritable> {

    IntWritable v = new IntWritable();

    /**
    *

    • @param key 输入的key
    • @param values 表示所有v的迭代器对象,对v的处理需要通过迭代器迭代累加。
    • @param context 负责数据的输出(负责整个Reducer中执行过程的调度)
    • reduce方法的执行: 对一组相同key的kv组执行一次.
    •             例如(atguigu,1   atguigu,1   atguigu,1)
      

    */
    @Override
    protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
    int sum = 0 ;
    //迭代values,将迭代出的值进行累加,得出当前key出现的次数
    for (IntWritable value : values) {
    sum += value.get();
    }
    //封装v
    v.set(sum);

    //写出
    context.write(key,v);
    

    }
    }

============================================================================
package com.atguigu.mr.wordcount;

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;

public class WordCountDriver {
public static void main(String[] args) throws Exception {
//1. 创建Job对象
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
//2. 关联Jar
job.setJarByClass(WordCountDriver.class);
//3. 关联Mapper 和 Reducer
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
//4. 设置Mapper输出的key和value类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//5. 设置最终输出的key和value类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//6. 设置输入和输出路径
FileInputFormat.setInputPaths(job,new Path(“D:/input/inputWord”));
FileOutputFormat.setOutputPath(job,new Path(“D:/output1”));
//7. 提交Job
job.waitForCompletion(true);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值