hadoop(9)--MapReduce入门WordCount

众所周知,hadoop的核心有hdfs,mapReduce,之前8次的分享都是在将hdfs,那么从这次开始来分享一下mapReduce
MapReduce就是java程序,这一句话一出来让我这个java程序员看到很容易接受,有木有???
没错,学习任何东西入门不是helloWorld吗?怎么变成wordCount了呢?其实这里的wordCount就是helloWorld,先看看wordCount的代码,如下
map类

package com.xmf.mr.wordCount;


import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.util.StringUtils;

import java.io.IOException;
import java.io.StringWriter;

/**
 * Created by Administrator on 2018/4/16.
 */
public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> {
    //每读一行数据就调用一次这个方法
    //key这一行的起始偏移量
    //value是这一行的文本内容
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //将这一行的内容转换为String
        String line = value.toString();
        //以空格切分
        String[] words = StringUtils.split(line, ' ');
        //遍历单词数组,输出k-V
        for (String word :words){
            context.write(new Text(word),new LongWritable(1));
        }

    }
}

Reduce类

package com.xmf.mr.wordCount;

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

import java.io.IOException;


/**
 * Created by Administrator on 2018/4/16.
 */
public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable>  {

    //框架在mapper处理结束之后,将所有kv缓存起来,进行分组,然后传递一个组<key,values{}>,调用一次reduce
    //<hello,{1,1,1,1,1}>
    @Override
    protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {


        long count =0;
        for (LongWritable value : values){
            count += value.get();
        }
        //输出这个单词的统计结果
        context.write(key,new LongWritable(count));
    }
}

启动类

package com.xmf.mr.wordCount;

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

import java.io.IOException;


/**用来描述特定的作业
 * 比如改作业使用那个类作为map,哪个作为reducer
 * 还可以指定输入数据路径
 * 还可以指定输出文件路径
 * Created by Administrator on 2018/4/18.
 */
public class WCRunner {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

        Configuration conf = new Configuration();
        //System.setProperty("hadoop.home.dir", "D:\\hadoop-2.4.1\\hadoop-2.4.1");
        Job job = Job.getInstance(conf);
        //设置job所用的哪些类在哪里
        job.setJarByClass(WCRunner.class);
        job.setMapperClass(WCMapper.class);
        job.setReducerClass(WCReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);

        //原始数据存放路径
        FileInputFormat.setInputPaths(job,new Path("hdfs://my01:9000/wc/srcdata"));
        //输出文件存放路径
        FileOutputFormat.setOutputPath(job,new Path("hdfs://my01:9000/wc/output"));
        //将job提交给集群
        job.waitForCompletion(true);

    }
}

这个是我写的一个WordCount,要在windows(本地)运行需要修改很多东西,我已经修改了,不懂得朋友可以评论,我会收到通知,及时给你解答,这里就不在赘述,那么先看看在linux环境中,用hadoop命令运行的这种方式,这种方式不利于调试,入门嘛,先不管调试了,我们的目的很明确,就是对MR有一个直观的认识.
记录一下intellij idea怎么打jar包
第一步:


image.png

第二步:


image.png

第三步:
image.png

=====华丽的分割线====
继续,将上面的代码打位jar包,发送到服务器上
image.png

数据准备


image.png

数据:
image.png

运行
hadoop jar wordCount.jar com.xmf.mr.wordCount.WCRunner
image.png
image.png

已经执行完了,看看执行结果

image.png

从结果可以看出来已经统计出了word的数量

望指正,不吝赐教!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目的这篇教程从用户的角度出发,全面地介绍了Hadoop Map/Reduce框架的各个方面。先决条件请先确认Had...
    SeanC52111阅读 1,767评论 0 1
  • Hadoop的编程可以是在Linux环境或Winows环境中,在此以Windows环境为示例,以Eclipse工具...
    欢醉阅读 1,455评论 0 28
  • 当数据量增大到超出了单个物理计算机存储容量时,有必要把它分开存储在多个不同的计算机中。那些管理存储在多个网络互连的...
    单行线的旋律阅读 1,949评论 0 7
  • 什么是迭代器?Iterator其实就是集合的取出元素的方式 。因为每个集合的取出方式不同,所以就把取出方式定义在集...
    menmo_O阅读 231评论 0 0