7.1 概述
7.1.1 分布式并行编程
目前遇到的问题:1)摩尔定律开始失效,单个CPU的性能提升速度放缓;2)但需要处理的数据迅速增加
两种解决的途径:1)CPU由单核变为多核,2)分布式并行编程
MR之前:已有MPI等成熟的并行计算框架,但MPI有以下缺点:① 使用共享式集群,容错性差、② 硬件价格高且扩展性差、③ 学习难度大。相对来说MR在上述问题上进行了改进。但是,在适用场景上,MPI可以用于实时、细颗粒度、计算密集型场景,而MR适用于离线非实时批处理。
7.1.2 MapReduce模型简介
1)把过程高度抽象为Map和Reduce两个函数
2)从而降低了学习难度,变成很容易
3)分而治之的策略:把数据分片,由多个Map任务并行处理
4)计算向数据靠拢的设计理念:数据分布存储到多台机器上,map任务被发送到数据所在机器或尽可能临近的机器,避免了数据传输的开销。
5)Master/Slave架构
6)支持多种语言
7.1.3 Map和Reduce
Map:1)把小数据集进一步解析成一批k-v对,并输入到Map函数;2)每一个输入的k1-v1对经过Map函数处理后,输出一批新的k2-v2对,k2-v2对是中间结果。
Reduce:把中间值根据键值(k2)进行聚合输出。
具体的Map处理过程和聚合过程,则由用户编程完成
7.2 MapReduce的体系结构
主要由以下四个部分构成。
1)Client
用户编写的程序通过Client提交到JobTracker端
用户可以通过Client提供的API查看作业运行状态
2)Job Tracker
负责资源监控和作业调度
监控所有的TaskTracker和Job的健康状况
跟踪任务进度、资源使用情况等,并告知TaskScheduler,由后者进行合适的资源调度
3)TaskTracker
将本节点任务进度、资源使用情况等发给JobTracker,并接受后者命令进行启动新任务、杀死任务等操作。
4)Task
分为Map Task和Reduce Task两种,均由TaskTracker启动
7.3 MapReduce工作流程
7.1 概述
大致流程是:原始数据分片 → 每个分片启动一个Map任务,进行并行处理 → shuffle:对Map的输出进行分区、排序、归并等 → 发送给Reduce任务进行处理 → 输出并进行分布式存储
有以下特点
1)不同的Map任务间不会通信
2)不同的Reduce间也不会有通信
3)用户不能显式地操作不同机器间地消息发送,一切都由MapReduce框架自身实现
7.3.2 MapReduce各个执行阶段
1. 基本过程
1)预处理:由InputFormat模块完成数据的格式验证,文件的逻辑切分(切分为多个InputSplit)等工作。
2)数据加载和转换:由RecordReader模块根据InputSplit信息加载数据,并转换成适合Map任务读取的键值对,然后输入给Map任务。
3)Map任务:把输入的kv对转换成另一堆kv对,具体的转换规则由用户编程完成。
4)Shuffle:对Map任务的输出进行分区、排序、合并、归并等操作,然后发送给Reduce任务
5)Reduce:把接收的kv对根据k进行聚合,具体聚合方式由用户编写的Reduce任务完成
6)输出、保存:由OutputFormat模块验证结果,并把结果保存到分布式文件系统
2. 重点概念
1)分片(Split):在HDFS中,一个文件并分为很多个物理分块(block)。对于MapReduce而言,其处理单位是Split,是一个逻辑概念,只包含一些元数据信息,如数据起始位置、数据长度、数据所在节点等。每个分片对应一个Map任务,设置多少分片就会有多少个Map任务,太多耗费管理资源,太少则降低并行度,通常会把分片大小设置成一个HDFS块的大小。
2)任务数量:Map任务数量上文已描述。Reduce任务数量取决于集群可用的Reduce任务槽(slot)的数目,通常设置成略小于可用数的数
7.3.3 Shuffle过程 ☆
1. Map端的shuffle过程
1)输入数据和执行Map任务:每一个Map接受一个分片,并进行处理。
2)写入缓存:MapReduce默认100MB的缓存,Map任务的输出先往缓存里进行存储。
3)溢写
当缓存用到一定比例(常见0.8,即已用了80MB空间)时,启动溢写操作,把数据写入磁盘。但是溢写并不是直接写到磁盘里,而是首先进行了分区、排序、合并等操作。
分区:因为每个Map的输出都会分发到多个Reduce任务上,所以先对这些kv对们进行分区。最常用的分区方式是对key进行哈希后再用Reduce任务数取模。
排序:每个分区的数据根据key值进行排序,是MR的默认操作。
合并(可选操作):如果有两个<"a",1>键值对,可以合并成<"a",2>,相当于把值相加,这是用户自己定义的合并方式。合并是为了减少写入磁盘的数据量,但必须保证不影响后续的Reduce结果。
完成上述操作后,缓存的数据被写入磁盘
4)文件归并:Map任务全部完成后,进行归并操作。若存在两个<"a",1>键值对,则把它归并成<"a",<1,1>>,(注意合并与归并的区别,归并就是把值合成一个列表)。归并操作也不一定执行,只有在溢写文件数量大于预设值时才会执行。
上述操作全部完成后,Map端的shuffle就完事了。
2. Reduce端的shuffle过程
1)Reduce任务通过RPC向JobTracker询问任务是否已完成,若完成则领取数据
2)归并、合并、排序 :Reduce任务从不同的Map任务领取了多份数据,放入缓存,先归并,再合并(可选),然后写入磁盘
3)多个溢写文件归并成一个大文件
4)发送给Reduce处理
7.3.4 MapReduce应用程序的执行过程
笼统描述为 输入文件 → Map阶段 → 中间文件 → Reduce阶段 → 输出文件。其中Map和Reduce任务是由用户编写,中间的shuffle是自动完成的。其它略。
7.4 WordCount示例
WordCount示例之于分布式编程,就像Hello World之于编程。
7.4.1 任务分析
不是所有任务都能用MR去做,只有能执行分而治之的策略的任务才可以。
7.4.2 程序设计
1)原始数据处理:把原始数据分片,把每片中的内容按行拆分成键值对,以行号作为键,以行内容作为值。这样就可以作为Map的输入了。
2)Map任务:举例来说,输入是<1, "hello world bye world">,输出是<hello, 1>、<world, 1>、<bye, 1>、<world, 1>四个键值对。
3)Shuffle:如果未定义合并操作,则shuffle进行归并和排序,上述输出变成了<bye, 1>,<hello,1>,<world,<1,1>>。(如果定义了合并操作,最后一项可以变成<world, 2>)
4)Reduce任务:归并、排序、求和(因为是count任务,所以是求和操作进行聚合)
5)输出与存储
7.5 MR的具体应用
MR可以应用于关系代数运算、分组聚合运算、矩阵-向量乘法、矩阵乘法等。
所谓关系代数运算,就是指关系型数据库的筛选、并交差、连接等操作。Hadoop中的hive工具,就是把SQL语句转换成MapReduce任务。
不太懂,略过。
7.6 MR编程实践
学会java后再写,掠过。
网友评论