• 大数据小项目之电视收视率企业项目08--》MapReduce编写之Wordcount


    编程规范

    (1)用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)

    (2)Mapper的输入数据是KV对的形式(KV的类型可自定义)

    (3)Mapper的输出数据是KV对的形式(KV的类型可自定义)

    (4)Mapper中的业务逻辑写在map()方法中

    (5)map()方法(maptask进程)对每一个<K,V>调用一次

    (6)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV

    (7)Reducer的业务逻辑写在reduce()方法中

    (8)Reducetask进程对每一组相同k的<k,v>组调用一次reduce()方法

    (9)用户自定义的Mapper和Reducer都要继承各自的父类

    (10)整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象

    wordcount示例编写:

    (1)定义一个mapper类

    package com.it18wang.TextMaven;
    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;
    
    public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
        //map方法的生命周期:  框架每传一行数据就被调用一次
        //key :  这一行的起始点在文件中的偏移量
        //value: 这一行的内容
        
            protected void map(LongWritable key, Text value,Context context)
                throws IOException, InterruptedException {
            String line=value.toString();
            String[] words = line.split(" ");
            //遍历数组,输出<单词,1>
            for(String word:words){
                context.write(new Text(word), new IntWritable(1));
            }
          }
        }
    }

    (2)定义一个reducer类

    //生命周期:框架每传递进来一个kv 组,reduce方法被调用一次
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            //定义一个计数器
            int count = 0;
            //遍历这一组kv的所有v,累加到count中
            for(IntWritable value:values){
                count += value.get();
            }
            context.write(key, new IntWritable(count));
        }
    }

    (3)定义一个主类,用来描述job并提交job

    package com.it18wang.TextMaven;
    
    import java.io.IOException;
    
    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 IOException, ClassNotFoundException, InterruptedException {
            Configuration conf=new Configuration();
            Job job=Job.getInstance(conf);
            job.setJarByClass(WordCountDriver.class);
            job.setMapperClass(WordCountMapper.class);
            job.setReducerClass(WordCountReducer.class);
            
            FileInputFormat.addInputPath(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
            
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);

          //向yarn集群提交这个job

          int result=job.waitForCompletion(true)?0:1;

            System.exit(result);
        
        }
    }

    把这个项目打jar包,上传到Linux上,然后

    hadoop jar mr.jar com.it18wang.testmaven.WordCountRunner /wc_input /wc_output1

    运行

    运行成功后,会在 HDFS上生成一个/wc_output1目录,目录下面就是结果。

  • 相关阅读:
    python中字母的大小写转换
    十进制转换为16进制
    查找数组中出现次数超过一半的数
    leetcode二分查找
    leetcode 3 字符串
    leetcode链表篇
    leetcode数组篇
    重构二叉树
    矩阵的特征向量和特征值
    微软编程
  • 原文地址:https://www.cnblogs.com/wakerwang/p/9474049.html
Copyright © 2020-2023  润新知