hadoop第3天

1 MapReduce概述;
    MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.
    MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算,非常简单。
    这两个函数的形参是key、value对,表示函数的输入信息。
2 执行步骤:
     1. map任务处理:
        1.1 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
        1.2 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
        1.3 对输出的key、value进行分区。
        1.4 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
        1.5 (可选)分组后的数据进行归约。
     2.reduce任务处理:
        2.1 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
        2.2 对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
        2.3 把reduce的输出保存到文件中。
        例子:实现WordCountApp
3 问题:
    MapReduce框架的结构是什么
    Map在整个MR框架中作用是什么
    Reduce在整个MR框架中作用是什么

4 代码:
1 map  任务处理
   hdfs:原始数据:
        hello tom
        hello jerry
        hello kitty
        hello world
        hello tom
    计算:<k1,v1>  内容字符的偏移量
    map阶段(逐行读取hdfs的数据):
    <0,"hello tom">
    <10,"hello jerry">
    <22,"hello kitty">
    <34,"hello world">
    <46,"hello tom">
    map(){
        //0
        int key=k1;
        //"hello tom"
        String value=v1;
        String[] words=value.split(" ");
        for(String w:words){
            context.write(w,1);
        }
        
    }
    Reduce阶段<k2,v2>
        数据解析和合并
        <hello,{1,1,1,1,1}>
        <jerry,{1}>
        <kitty,{1}>
        <tom,{1,1}>
        <world,{1}>
     reduce(){
        int counter=0;
        for(int i:v2s){
            counter+=i;
        }
        context.write(key,counter);
     }
    组装map和Reduce 组合
      public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        //conf.setInt("mapreduce.client.submit.file.replication", "20");
        Job job = Job.getInstance(conf);
        
        //notice
        job.setJarByClass(WordCount.class);
        
        //set mapper`s property
        job.setMapperClass(WCMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        //FileInputFormat.setInputPaths(job, new Path("/root/words.txt"));
        FileInputFormat.setInputPaths(job, new Path("/root/words"));
        
        //set reducer`s property
        job.setReducerClass(WCReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        FileOutputFormat.setOutputPath(job, new Path("/root/wcout"));
        
        //submit
        job.waitForCompletion(true);
    }
    ===========================
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值