分布式编程MapReduce

MapReduce的策略:

1.采用分而治之

2.把非常庞大的数据集,切分成非常多的独立的小分片

3.然后为每一个小分片单独地启动一个map任务

4.最终通过多个map任务,并行地在多个机器上去处理


MapReduce的理念:

·计算向数据靠拢而不是数据向计算靠拢

·要完成一次数据分析时,选择一个计算节点,把运算数据分析的程序放到计算节点上运行

·然后把它所涉及的数据,全部从各个不同的节点上面拉过来,传输到计算发生的地方


  MapReduce slave架构:


MapReduce模型的核心函数:

Map函数:该函数的输入来自分布式文件系统的文件块,这些文件块的格式是任意的,可以是文档格式,也可以是二进制格式,将输入的元素转换为<key,value>的形式

函数输入输出说明
Map

<k1,v1>

如:

<行号,“abc”>

List(<k2,v2>)

如:<“a”,1>

<“b”,2>    <“c”,3>

1.将小数据集进一步解析成一批<key,value>对,输入Map函数中进行处理

2.每一个输入的<k1,v1>会输出一批<k2,v2>。其中<k2,v2>是计算的中间结果

Reduce

<k2,List(v2)>

如:

<"a",<1,1,1>>

<k3,v3>

<"a",3>

输入的中间结果<k2,List(v2)>中的List(v2)表示是一批属于同一个k2的value

 Reduce函数:该函数的任务就是将一个输入的一系列具有相同键值对的键值对以某种方式组合起来,输出处理后的键值对,输出结果会合并成一个文件。

输入输出

<key,value-list>

一个键以及一堆值的列表

value-list是值的列表,比如前面key是a后面的一堆值列表<1,1,1>就是

一堆的值,很多的值构成一个列表list

对value-list进行一个reduce的结果对这些值进行一个汇总求和

求和以后就生成一个<key,value-list>


MapReduce的体系结构

 Client(客户端):通过client可以提交用户编写的应用程序,用户通过它将应用程序交到JobTracker端,也可以查看当前提交作业的运行状态

JobTracker(作业跟踪器):1.负责资源的监控和作业的调度   2.监控底层的其他TaskTracker以及当前运行的Job的健康状况  3.一旦检查到失败的情况就把这个任务转移到其他节点继续执行跟踪任务执行进度和资源的使用量

TaskTracker(任务调度器):1.执行具体的相关任务,一般接收JobTracker发送过来的命令    2.把一些自己的资源使用情况,以及任务的运行进度通过心跳的方式发送给JobTracker。它通过slot的概念检查自己的资源使用状况,任务调度器将内存和CPU资源打包,然后等分成若干个slot

Tack(任务) :分为map任务和reduce任务,map任务调用map函数,reduce任务调用reduce函数



MapReduce工作流程

 流程概述:一个大的MapReduce作业,首先会被拆分为若干个Map任务,但Map任务结束会生成许多个<key,value>的中间结果,这些中间结果会被发送到Reduce中处理,具有相key的<key,value>会被发送到同一个Reduce任务,Reduce任务会对中间结果进行汇总计算,然后输出到分布式文件系统。


MapReduce的各个执行阶段

 1.MapReduce框架通过InputFormat检验输入格式是否正确,然后将文件分为逻辑上的多个InputSplit,因为只是逻辑概念,每一个InputSplit并没有对文件进行实际的切分,只是记录了数据的位置和长度 

2.通过PecordReader(RR)根据InputSplit中的信息来处理InputSplit中的具体内容,加载数据并转换会适合Map任务读取的<key,value>键值对

3.Map任务输出一系列<key,value>作为中间结果

4.通过Shuffle过程对Map输出的中间结果进行排序,合并,归并等操作

5.Reduce以一系列<key,value-list>为中间结果输出到OutputFormat模块

6.OutputFormat模块对输出目录是否存在进行检查,以及输出结果类型是否符合配置文件中的类型,如果满足就输出到分布式文件系统


Shuffle过程详解

Shuffle简介:

 (1)在Map端的Shuffle过程:Map任务的结果首先被写入缓存,当缓存满时启动溢写操作,在Map任务结束之前 溢写文件会被归并成一个磁盘文件然后交给Reduce任务

(2)在Reduce端的Shuffle过程:Reduce任务对从Map端的不同数据进行处理归并后交给Reduce处理


Map端的Shuffle过程:

 1.输入数据和执行Map任务:输入的数据一般保持在分布式文件系统的文件块中,Map任务将接受<key,value>作为输入后一定的映射规则将其转换为多个<key,value>输出

2.写入缓存:Map结果首先写入缓存,积累到一定量后再一次批量写入磁盘

3.溢写(分区,排序和归并):缓存的容量默认为100MB,但缓存量达到80MB的时候将数据写入磁盘,留有20MB容量进行缓存数据,在溢写到磁盘前缓存中的数据首先会被分区,然后对相同key的数据进行归并


Reduce端的Shuffle过程:

 (1)领取数据:每个Reduce任务会不断地通过RPC向JobTracker询问Map任务是否以及完成,若JobTracker检测到Map任务完成就好通知Reduce任务领取属于自己的分区数据到本地磁盘

(2)归并数据:将数据写的Reduce任务的缓存中,缓存过连也会溢写到磁盘,然后对数据进行排序,归并,再传输带Reduce任务

(3)把数据写到Reduce任务:执行Reduce函数中的各种映射,输出最终结果,并将结果保持到分布式文件系统中(比如HDFS或GFS)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

前段被迫创业

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值