MapReduce基础

MapReduce基础

1. MapReduce思想

什么是MapReduce?
在这里插入图片描述

MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。

Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。

Reduce负责“合”,即对map阶段的结果进行全局汇总。
这两个阶段合起来正是MapReduce思想的体现。

MapReduce执行流程
在这里插入图片描述

MapReduce设计构思

MapReduce实现的分布式的运算,程序往往需要分成至少2个阶段:

1)第一个阶段的map 任务(task)并发执行,完全并行运行,互不相干。

2)第二个阶段的reduce task 并发执行,互不相干,他们的数据依赖于所有 map task 的输出。
map task有若干个,每个 map task 处理一部分数据,对数据进行分类等操作,并得到一个结果数据,然后每个 map task 处理之后的数据,会被拿到 reduce task 端进行合并。

所以简单来说:
map task是用来处理每一小份数据的;
reduce task是用来合并map task处理之后的数据的;

2. MapReduce详解

在这里插入图片描述

Shuffle概念

map阶段处理的数据如何传递给reduce阶段,是MapReduce框架中最关键的一个流程,这个流程就叫shuffle。
shuffle: 洗牌、发牌——(核心机制:数据分区,排序,合并等过程)。
shuffle是Mapreduce的核心,它分布在Mapreduce的map阶段和reduce阶段。一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。

在这里插入图片描述

在这里插入图片描述

这其中有一个很重要的知识点,洗牌阶段有多少次排序?

Hadoop Shuffle过程中总共发生3次排序,详细分别如下:

第一次排序行为:在map阶段,由环形缓冲区溢出到磁盘上时,落地磁盘的文件会按照key进行分区和排序,属于分区内有序,排序算法为快速排序.

第二次排序行为:在map阶段,对溢出的文件进行combiner合并过程中,需要对溢出的小文件进行归档排序,合并,排序算法为归并排序.

第三次排序行为:在map阶段,reduce task将不同map task端文件拉取到同一个reduce分区后,对文件进行合并,排序,排序算法为归并排序.

3. Writable序列化

  • 序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。
  • 反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。
  • Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,hadoop自己开发了一套序列化机制(Writable),精简、高效。
Java类型Hadoop Writable类型
booleanBooleanWritable
byteByteWritable
intIntWritable
floatFloatWritable
longLongWritable
doubleDoubleWritable
stringText
mapMapWritable
arrayArrayWritable

4. MapReduce编程规范

用户编写的程序分成三个部分:Mapper、Reducer和Driver。
1)Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
(3)Mapper中的业务逻辑写在map()方法中
(4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5)每一个<K,V>调用一次 map() 方法
2)Reducer阶段
(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
(3)Reducer的业务逻辑写在reduce()方法中
(4)对每一组相同k的<k,v>组调用一次reduce()方法
3)Driver阶段
整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象

5. Mapreduce中的HelloWorld

// Mapper的第一个参数LongWritable类型,对应map方法的key参数类型;
// 第二个参数Text类型,对应map的value参数类型; 
// 第三个参数Text类型,对应map方法的context.write(new Text(word), new LongWritable(1)) 
// 第一个参数类型;第四个参数LongWritable,对应context.write第二个参数类型

public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable> { 	@Override 
  protected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {
      //每读取一行,调用一次map方法,value中存放的就是一行数据 
      String line = value.toString(); 
      //调用split方法,对行按照空格分割,获得String的数据 
      String[] words = line.split(" "); 
      //遍历数组,组成key-value,key每个单词,value为1 //LongWritable就是支持序列化的long类型 
      for (String word : words) { 
          context.write(new Text(word), new LongWritable(1)); 		
      } 
  	}
}

//Reducer的第一个参数Text类型,对应map的输出key类型;LongWritable对应map的输出value类型; 
//Text类型对应reduce方法的输出key,LongWritable对应reduce方法的输出value

public class WordCountReducer extends Reducer<Text,LongWritable,Text, LongWritable> {
    @Override 
    // key对应 map方法中 context.write(new Text(word), new LongWritable(1));
    // 的 new Text(word);values 为相同key组成的集合
    protected void reduce(Text key, Iterable<LongWritable> values,Context context) throws IOException, InterruptedException { 
        long sum = 0; 
        //获取集合的每个元素,也就是若干个1,进行累加 
        for (LongWritable longWritable : values) { 
            sum += longWritable.get(); 
        } 
        //得到的结果组成key-value,输出到文件中 
        context.write(key, new LongWritable(sum)); 
    } 
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nan feng

打赏一杯咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值