hadoop学习笔记(七)MapReduce原理与详细的执行阶段

分布式并行编程

在这里插入图片描述

  • 传统的分布式并行编程是共享存储,容错性低,硬件出错,整个集群瘫痪,价格贵等等
  • MapReduce使用PC就可以成为集群,硬件价格低,将作业分散计算,再求和,而且hadoop整个集群容错性高,一台及群众的机器坏掉不会影响整个集群的工作。

计算向数据靠拢

数据向计算靠拢:完成一次数据分析,选择一个计算结点,把运行分析的数据放在计算结点上,然后把所涉及的数据拉到计算结点上,开始计算。大数据放在一个节点必然崩溃。在这里插入图片描述

计算项数据靠拢:将计算程序或者其应用程序分发到数据所在的程序,完成各个部分的计算,数据不用发生计算,最后汇总。
在这里插入图片描述

抽象成的Map和Reeuce函数

Map和Reduce的逻辑需要自己具体实现,但是输入输出的形式都是不变的。
在这里插入图片描述
value-list也就是一个值的列表,比如<“a”, <1,2,3,4,5>>其中的<1,2,3,4,5>就是一个value-list,作为reduce函数的输入。map和reduce中间还要经历看不见的shuffle。

MapReduce的工作流程

某两个结点的mapreduce的各个执行阶段
在这里插入图片描述
MapReduce算法各个执行过程

  1. 从HDSF中加载文件,使用InputFormat模块做预处理,检查是否符合输入要求,然后逻辑分割成splite(就是那里是开始结束开始结束…)
  2. 逻辑上的各个splite放入通过RR(记录阅读器RecordReaer)来处理splite上的信息,转换为Map任务或者Map函数的输入值<key,value>,Map里面的逻辑是自己编写的
  3. 根据自己编写的Map的逻辑,输出多个<key,value>作为各个Map任务输出结果
  4. 将多个Map任务的输出结果进行分区,排序,合并,归并操作,也就是经过shuffle过程,得到Reduce任务的输入值<key,value-list>,其中value-list就是一组新的值,例如<“a” , <1,2,3,4,5>>。
  5. Reduce以shuffle之后的<key,value-list>作为输入值,完成自己编写的逻辑,结果传入OutFormat模块
  6. OutFormat验证是否输出结果类型是否符合格式,检查输出目录是否存在

理想情况下一个splite是一个block会避免额外的网络传输和I/O的开销。
Reduce任务数量取决于有多多少reduce的slot。(和MapReduce的资源分配相关)


shuffle过程

shuffle过程:
在这里插入图片描述

  • Reduce任务和Map任务可能在一台机器,也可能不再一台机器上
  • 此图显示了一个Map任务和一个Reduce任务,实际上有多个Map任务和多个Reduce任务
  • shuffle分成Map的shuffle和Reduce的shuffle

Map端的shuffle阶段简介:

从HDFS读取数据,经过InputFormat和RR之后转换为<key , value>的形式被读取,通过Map任务之后生成<key,value>的形式,先写入缓存,在经过分区,排序,合并,随着Map任务的执行,会出现多个分区,排序,合并之后的文件,在Map任务全部结束之前会把之前的这些文件归并为一个大的文件,通知相应的Reduce的任务来领取自己处理的数据,这个大文件也是分区,排序的。

Reduce端的shuffle阶段简介:
Reduce任务从不同运行Map任务的机器领回属于自己的那部分数据<key,value-list>,然后归并交给Reduce任务处理。

Map端的shuffle阶段

以下是一个Map任务的过程,正常的情况下会经过InputFormat进行切分,分成splite,splite经过RR,生成MAp任务的输入值:
在这里插入图片描述

  1. 输入的数据可能是文本文件,也可能是二进制文件,经过InputFormat和RR之后转换为<key , value>的形式作为Map任务的输入,然后经过自己编写的逻辑,得到Map任务的输出<key,value>
  2. 每一个Map任务都会默认分配100MB的缓存, Map处理之后先写入缓存,不是直接写到磁盘中的,防止过大的磁盘寻址开销,写入缓存的目的就是将这种寻址开销分摊到多个数据中去,不用每写一次就要进行寻址
  3. 不是说沾满100MB才会往磁盘写数据,这样会造成不断运行的Map任务的结果会没有地方写,造成丢失,所以会设置溢写比,达到这个门槛的时候就会开始溢写。比如溢写比为0.8,达到80MB就会开始溢写。在写入磁盘之前,会进行开始分区,排序,合并
  • 分区:按照哈希函数hash(key) mod R进行分区,R是Reduce任务的数量。也可以自己通过重载Partitioner接口来进行自定义分区
  • 排序:分区之后,对每个分区按key进行内部排序。
  • 合并:自己定义了Combiner函数才会合并,没有定义就不会合并。合并就是指将<key,value>中相同的key值对应的value相加,不是所有场景都能合并的。
  1. 溢写操作完成之后,就会在磁盘中产生一个新的溢写文件,随着Map任务的进行,磁盘中溢写文件越来越多,会归并成一个大的溢写文件,这个溢写文件也是分区,排序,合并的。归并就是指相同的key的键值对的value组成一个<key,value-list>。

如果进行归并的时候溢写文件超过参数3(可以自己设置),可以再次运行合并操作减少数据量,如果没超过,就不用进行合并了。

总结:经过以上操作之后,Map的shuffle操作就完成了,Map执行任务会被监测,一旦监测到Map任务完成,生成了一个大的文件,就会通知相关的Reduce任务来领取数据,然后开始Reduce的shuffle过程。

Reduce端的shuffle阶段

这也是一Reduce任务的shuffle过程:
在这里插入图片描述

  1. 监测到Map任务已经完成,就会通知Reduce任务去相应的Map机器上面把属于字处理的那部分分区拉到本地来,Map任务有多个,就要去取回多个不同的分区。从Map端领回的数据会先放在Reduce机器的缓存中。
  2. 写入缓存的数据是来自不同的Map机器,开始溢写的时候会把具有key相同的键值对进行归并。如果之前定义了合并,归并的数据也会合并。同理每次溢写过程结束之后会生成一个溢写文件。所有的Map端的数据都被领回的时候,多个溢写文件会归并成一个大文件,归并的时候进行排序,使最后的大文件是有序的。
    因为reduce任务会从不同map-shuffle阶段所在的分区中领取数据,必然会出现例如<key,value>或者<key,value-list>,所以redcue-shuffle阶段把这些<k,v>归并成一个唯一的key的键值对<key,value-list>。
    具体的说,比如reduce领取到了<“word”,1>,<“word”,<1,1,1>>,<“word”,<1,1>>都会被归并成<“word”,<1,1,1,1,1>>。
  3. 可以归并的文件数量默认是10,也就是到达10个溢写文件彩绘开始归并成一个大溢写文件。归并后得到若干的大文件,直接将这些文件发送给Reduce任务开始执行,最后输出结果。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值