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)