4.1 概述
1、概念
是一种分布式并行编程模型,也是一个处理和生成超大数据集的算法模型的计算框架。
2、与传统分布式并行编程模型的不同
(1)集群的架构性和容错性:
- 采用典型的非共享式架构
- 集群中,每个节点都有自己的内存,任何一个节点出问题都不会影响其他节点,集群又设计了荣誉和容错机制
(2)硬件价格和扩展性 集群可以随意增加节点,只需要廉价的PC机就可以。 (3)编程和学习难度: 不需要有丰富经验的并行计算和分布式处理系统的程序员,它会自动实现分布式部署,部署到集群的各个机器上运行。 (4)适用场景: 非实时的批处理以及数据密集型的应用
3、主要思想
分而治之(策略) (1)描述:一个存储在分布式存储系统中的大规模数据集被切分成多个独立的分片(split),这些分片交给多个Map任务并行处理,Map任务生成的结果,会作为Reduce任务的输入,最终由Reduce任务合并结果,生成最终结果,并写入分布式文件系统。 (2)上升到抽象模型:Mapreduce借鉴Lisp函数式语言的思想,用Map和Reduce两个函数为高层并行编程提供抽象模型 (3)上升到框架:为Mapreduce设计提供了统一的计算框架,为程序员隐藏了大多数系统层的处理细节
计算向数据靠拢(理念) Mapreduce会将Map运行于在就近与数据节点上,即将计算节点和存储节点放一起运行,减少节点之间数据传输的开销。
4.2 MapReduce架构(主从架构)
1、Client
(1)将用户编写的MapReduce程序提交到JobTracker端。 (2)用户通过Client提供的一些接口查看作业运行状态
2、JobTracker
(1)负责资源监控和作业调度,监控所有TaskTracker与Job的健康状况 (2)JobTracker会跟踪任务执行进度、资源使用情况,并将这些汇报给任务调度器端
3、TaskTracker
(1)TaskTracker会周期性地通过心跳将本节点上资源地使用情况和任务运行情况汇报给JobTracker,同时接收JobTracker发送过来地任务命令,执行相应地操作。 (2)TaskTracker通过shot(任务槽)等量划分本节点上的资源量来分配资源,shot分为MapShot和ReduceShot分别供Map和Reduce使用。
4、Task
Map和Reduce是两种Task,均有TaskTracker启动。
4.3 MapReduce核心函数
1、Map函数
输入是分布式文件系统的文件块,将其转化成键值对,然后输出一批键值对,这些键值对是计算的中间结果,这批键值对会被缓存到内存中,周期性的写入本地磁盘。
2、Reduce函数
输入是相同键值k的value集合,就是<k,list(value)>,然后对这些value处理,并把这些值汇总求和,生成一个键值对。
4.4 MapReduce工作流程
1、加载文件
从分布式文件系统中加载文件
2、任务分片
InputFormat对文件进行格式验证,把大文件在逻辑上(用户自定义)切分成很多split(分片)。每个分片对应一个Map任务,Map任务即数量由split数量
3、Map任务
记录阅读器根据分片的位置和长度信息,从文件系统中相关的各个数据块中读出来,输出<Key,Value>形式。然后作为Map的输入,Map中就是用户自己撰写的逻辑,处理完后生成一堆的<Key,Value>。
4、shuffle过程
(1)简介:Map任务生成的<Key,list(Value)>先写入到内存中,当缓存满的时候再发生溢写,即写到本地磁盘中,同时清空内存,溢写的时候经历分区、排序、合并操作,生成多个磁盘文件,然后把多个磁盘文件的分区归并成一个磁盘文件的分区,然后通知Reduce任务取走相应的磁盘分区。Reduce各个不同的机器中的Map任务中取走属于自己任务的分区,然后进行归并,然后合并。然后把结果输入给reduce任务
(2)Map端的shuffle过程:
1)从分布式文件系统中加载文件,InputFormat对文件进行格式验证,把大文件在逻辑上(用户自定义)切分成很多split(分片)。每个分片对应一个Map任务。 2)Map任务生成的<Key,list(Value)>先写入到内存中,当缓存满的时候再发生溢写 3)溢写的过程中需要对数据分区(分区数量取决于Reduce任务数量),然后每个分区里的相关数据要进行排序(默认操作),然后可能发生合并操作(combine),即是对相同K的键值对相加,减少写入磁盘数据量。然后把这些数据写入磁盘,生成一个磁盘文件。 4)对多个溢写文件进行规并,生成一个大的文件,这个文件里面都是分区,排序的,然后写入本地磁盘。 5)JobTracker检测到这个过程结束后,通知Reduce取走属于自己的分区。
(3)Reduce端的shuffle过程: (1)Reduce任务接到JobTracker通知去相应的Map任务所在的机器上面拉到自己本地(自己的机器上) (2)由于从多个不同的Map任务上拉取的数据,先归并(生成一个KeyList,比如<a,<1,1,1>>),再合并(如果用户定义了,比如<a,1>,<a,1>—><a,2>),再写入到磁盘。 (3)在磁盘上再归并成大文件。 (4)把文件给Reduce任务处理。
4.5 MapReduce应用程序执行流程
用户写完应用程序后
(1)程序进行部署:把程序分配到不同机器上,一个机器作为Master,部分机器作为Woker,一部分执行Map任务,一部分执行Reduce任务。把执行的应用程序逻辑分发到这些机器上。 (2)Master监控集群的空闲状态,讲MapReducer任务分配一部分Woker执行Map任务,一些Woker执行Reduce任务。 (3)对大文件进行分片,然后用记录阅读器生成键值对,然后提交给Map函数,然后输出中间文件(一堆Keyvalue文件),写入缓存。 (4)缓存数据写满后,把缓存中的数据经过分区排序,可能发生的合并操作,写入磁盘。 (5)负责执行Reduce任务的机器使用远程调用从各个相关Map任务的机器中属于自己的数据,拉入到本地,把数据归并,然后传给用户自定义的Reduce函数。 (6)把相关的结果写入到分布式文件系统 注意:虽然Map阶段的Map任务和Reduce阶段的Reduce任务都是并行的,但是Reduce阶段依赖于Map阶段数据,所以一个MapReduce模型都是只有一个Map阶段和一个Reduce阶段。
4.6 MapReduce存在的问题
(1)存在单点故障
(2)JobTracker大包大揽导致任务过重
- 既要管资源管理调度分配
- 也要管任务的调度、监控以及失败的恢复
(3)容易内存溢出:分配资源的时候只考虑任务数,不考虑每个任务数到底消耗多少cpu和内存。
(4)资源划分不合理:他是把cpu资源打包,然后强行的等分成很多slot,再把slot划分给Map和Reduce,两者不能转化,导致如果一方空闲一方忙碌,资源划分不合理。
(5)MapReduce 主要面向对大规模数据的处理,适用于离线批 处理场景。
(6)由于每次操作需要遍历所有数据,MapReduce 并不适用于 需要实时响应的系统。
(7) 源代码层面分析的时候,代码非常的难读,增加 bug 修复和版本维护的难度。
|