MapReduce的WordCount案例过程分析及实现

功能介绍:在给定的文本文件之中统计出每个单词出现的次数

实现流程分析

  1. 输入数据:test.txt
  2. 期望输出数据:
    monkey 2
    pandas 1
    tiger 2
    owl 1
    cat 1
    dog 3
  3. 按照MapReduce编程规范编写程序
    1. Mapper
      • 将MapTask传给我们的文本内容转为String
      • 将String切分为单独的单词
      • 将每个单词输出KV对<单词,1>
    2. Reducer
      • 汇总每个key(也就是每个单词)的个数
      • 输出每个key的总次数
    3. Driver
      • 获取配置信息,获取Job对象实例
      • 指定本程序的jar包所在的本地路径
      • 关联Mapper/Reducer业务类
      • 指定Mapper输出数据的kv类型
      • 指定最终输出的数据的kv类型
      • 指定job的输入原始文件所在目录
      • 指定job的输出结果所在目录
      • 提交作业

具体实现

  1. 环境准备
    1.1 创建一个maven工程。

    1.2 加入如下依赖:

    <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.8.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>2.7.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>2.7.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>2.7.2</version>
            </dependency>
        </dependencies>
    

    1.3 编写log4j的配置文件log4j.properties

    	### direct log messages to stdout ###
    	log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    	log4j.appender.stdout.Target=System.out
    	log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    	log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    	log4j.rootLogger=debug, stdout
    
  2. 编写程序
    2.1 编写Mapper类

    package org.hadoop.mapreduce;
    
    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;
    
    
    // map阶段
    public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
        Text k = new Text();
        IntWritable v = new IntWritable(1);
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            // 1.从文件读取一行 eg: monkey monkey
            String line = value.toString();
            // 2.切割字符串
            String[] words = line.split(" ");
            // 3.循环写出
            for (String word:words){
                // monkey
                k.set(word);
                // 写出
                context.write(k,v);
            }
    
        }
    }
    

    2.2 编写Reducer类

    package org.hadoop.mapreduce;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    import java.io.IOException;
    
    /** * 佛祖保佑 永无BUG **/
    public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            //<monkey,1> <monkey,1>
            int sum = 0;
            // 1.对输入数据累加求和
            for (IntWritable value : values) {
                sum += value.get();
            }
    
            IntWritable v = new IntWritable();
            v.set(sum);
            // 2.写出 <monkey,2>
            context.write(key,v);
        }
    }
    

    2.3 编写Driver类

    package org.hadoop.mapreduce;
    
    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;
    
    import java.io.IOException;
    
    /** * 佛祖保佑 永无BUG **/
    public class WordCountDriver {
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            Configuration conf = new Configuration();
            // 1.获取job对象
            Job job = Job.getInstance(conf);
    
            // 2.设置jar存放路径(位置)
            job.setJarByClass(WordCountDriver.class);
    
            // 3.关联Map和Reduce类
            job.setMapperClass(WordCountMapper.class);
            job.setReducerClass(WordCountReducer.class);
    
            // 4.设置Map阶段输出数据的key&value类型
            job.setMapOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
    
            // 5.设置最终数据输出的key&value类型
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
    
            // 6.设置文本的数据输入路径和结果的输出路径
            FileInputFormat.setInputPaths(job,new Path(args[0]));
            FileOutputFormat.setOutputPath(job,new Path(args[1]));
    
            // 7.提交job
            boolean res = job.waitForCompletion(true);
    
            System.out.println(res);
        }
    }
    
    

    2.4 测试运行
    运行时传入2个参数,第一个是输入文件路径,第二个是结果输出文件路径:

    运行成功截图:

    进入output文件夹:

    打开最后一个part-r-00000文件:

    可以看到程序统计出来的结果与预期的结果相同。

全部评论

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务