MapReduce编程实现WordCount

在学习MapReduce的路上的伙伴,wordCount是入门了解map和reduce的工作原理。

接下来总结一下

MapReduce的实验基本过程

map过程:
1、map读取输入文件内容,按行解析成key1、value1键值对,key为每行首字母在文件中的偏移量,value为行的内容,每个键值对调用一次map函数;
2、map根据自己逻辑,对输入的key1、value1处理,转换成新的key2、value2输出;
3、对输出的key2、value2进行分区;
4、对不同分区的数据,按照key2进行排序、分组,相同的key2的value放到一个集合中(中间进行复杂的shuffle过程);
5、分组后的数据进行规约;
reduce过程:
1、对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点;
2、对多个map任务的输出进行Merge(合并、排序),根据reduce自己的任务逻辑对输入的key2、value2处理,转换成新的key3、value3输出;
3、把reduce的输出保存到hdfs上;

实验结果:在这里插入图片描述

实验结果:

在这里插入图片描述

package com.qst.demowc;

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;


/**
  * mapper类继承Mapper  表示我们的这个class类是一个标准的mapper类,需要四个泛型
  * k1  v1   k2  v2
  */
public class WordCountMapper  extends Mapper<LongWritable,Text,Text,IntWritable>{
   Text text = new Text();
   IntWritable intWritable = new IntWritable();

/**
 * 覆写父类的map方法,每一行数据要调用一次map方法,我们的处理逻辑都写在这个map方法里面
 * @param key
 * @param value
 * @param context
 * @throws IOException
 * @throws InterruptedException
/ *
    经过第一步:TextInputFormat之后
     0  hadoop,hive,hbase
     17 hive,storm
     27 hive,hbase,kafka
     */
    /**
     * @param key  我们的key1   行偏移量 ,一般没啥用,直接可以丢掉
     * @param value  我们的value1   行文本内容,需要切割,然后转换成新的k2  v2  输出
     * @param context  上下文对象,承接上文,把数据传输给下文
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] split = value.toString().split(",");
        //遍历我们切割出来的单词
        for (String word : split) {
            text.set(word);
            intWritable.set(1);
            context.write(text,intWritable);
        }

    }
}

package com.qst.demowc;

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

import java.io.IOException;
/**
 * 我们自定的class类继承reducer类表明我们这是一个标准的reducer类
 * 跟我们的k2  v2   k3  v3  四个泛型

 * 覆写reduce方法,
 * @param key  接收的key  是我们的K2
 * @param values  接收到value是一个集合  集合里面的数据类型是  v2 类型
 * @param context  上下文对象,将我们的数据往外写
 * @throws IOException
 * @throws InterruptedException
 */
 /*
  k2 v2的数据的一部分
  hadoop  <1,1>
  hive <1,1,1,1>
  hbase<1,1,1>
   */
public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
   IntWritable intWritable = new IntWritable();
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int a = 0;
        for (IntWritable value : values) {
            int i = value.get();
            a += i;
        }
        //将数据写出
        intWritable.set(a);
        context.write(key,intWritable);

    }
}
package com.qst.demowc;

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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class JobMain extends Configured implements Tool {

    public int run(String[] args) throws Exception {
        //获取一个job对象,用于我们任务的组织,通过job对象将我们八个步骤组织到一起,提交给yarn集群运行
        Job job = Job.getInstance(super.getConf(), "x2");
        //如果需要打包运行,一定得要加上这一句
        job.setJarByClass(JobMain.class);
        //1. 读取文件,解析成key,value对,这里是k1  v1
        job.setInputFormatClass(TextInputFormat.class);
        //   TextInputFormat.addInputPath(job,new Path("file:///F://input"));
        //使用本地模式来运行,从本地磁盘读取文件进行处理
        TextInputFormat.addInputPath(job,new Path("D:\\Hadoop\\wordCount.txt"));
        //2. 自定义map逻辑,接收第一步的k1,v1  转换成新的k2  v2  进行输出
        job.setMapperClass(WordCountMapper.class);
        //设置我们key2的类型
        job.setMapOutputKeyClass(Text.class);
        //设置我们的v2类型
        job.setMapOutputValueClass(IntWritable.class);

        //3.分区  相同key的value发送到同一个reduce里面去,形成一个集合
        //4.排序
        //5.规约
        //6.分组
        //从第三步开始以上都省掉
        //7.设置我们的reduce类,接受我们的key2  v2  输出我们k3  v3
        job.setReducerClass(WordCountReducer.class);
        //设置我们key3输出的类型
        job.setOutputKeyClass(Text.class);
        //设置我们value3的输出类型
        job.setOutputValueClass(IntWritable.class);
       //8.设置我们的输出类  outputformat
        job.setOutputFormatClass(TextOutputFormat.class);
//        TextOutputFormat.setOutputPath(job,new Path("file:///F://output2"));
        //输出已经统计好的数据的文件
        TextOutputFormat.setOutputPath(job,new Path("D:\\Hadoop\\wordCount1.txt"));
        boolean b = job.waitForCompletion(true);
        return b?0:1;
    }

    public static void main(String[] args) throws Exception{
        int run = ToolRunner.run(new Configuration(), new JobMain(), args);
        System.exit(run);
    }
}

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页