基于分布式结构的分布式计算:MapReduce 浅析


1.介绍

​ MapReduce是一种编程模式,是用于产生和处理海量数据集的。整个过程分为map函数和reduce函数

用户自定义的map函数
MapReduce库
用户自定义的reduce函数
输入key/value
中间键值对
中间键值对
合并具有相同key的值部分
把已经缩小的value集合进一步缩小
0或1个输出
reduce函数通过一个迭代器把中间键的value提供给reduce函数,因此通过内存来控制value列表最后的尺寸。

      出错处理:采用重新执行作为容错的优先方式。

2.编程模式

       举这样一个例子,统计一个文档内单词出现的个数。map函数检查每一个单词,并增加对应的计数器,reduce函数对几个特殊单词出现的次数进行合并,例如敏感词等等。

2.1实例

map(string key,string value):
//key:name of the file
//value:context of the file
for each word w in value:
	EmitIntermediate(w,"1");
//generate pair(word,number of word in the context)

reduce(string key,Iterator values)//key: the name of a word
//value: the list to count number of words
int result=0;
for each v in values:
	result+=ParseInt(v);
Emit(AsString(resut));
//get the words containing the target char and sum them up
//of simply sum up the number of specific words

2.2类型

map k1,v1
list k2,v2
list k2,v2
list v2

可以认为target={n1,n2,…};n1,n2,…∈k2

       输入的键值对和输出的键值对属于不同的域,而中间键值对和输出键值对是属于同一个域的,例如map的输出,就是reduce的输入。
map是映射,reduce是合并

2.3应用场景

2.3.1分布式grep,用于文件内字符串查找,太熟悉了

检查是否满足条件
map 输入行
输出本行

       这里reduce做直通函数。

2.3.2URL访问频率统计

map 浏览记录
list URL,1
list URL,1
list URL,总访问次数

2.3.3逆向Web-Link图

map URL , URL指向的资源列表
list URL,包含URL的网页列表
list target,source
list target,list source

2.3.4逆序索引

f
map 文档
list word,document ID
list word,document ID
list target,list source

       f:对每一个词,将他的文档列表进行排序,得到关键词在文档库中的位置。

2.3.5分布式排序

3.MapReduce实现

     Google广泛使用的计算环境:交换机连接的普通PC机的大集群。

	1.Linux系统,上千台普通网络硬件连接的廉价计算机集群。

	2.复制的方式避免文件系统的不可靠性。

	3.用户提交作业到调度系统,作业包含一个任务集,作业被调度者映射到一个可用机器集上。

3.1 执行预览

       map把输入数据分割(假设为M个),在R台机器上并行执行。Reduce通过中间键值对的key进行分布,采用适当的分区函数(例如hash(key)mod R)。
       1.把输入文件分成M片,在集群机器上执行分布式处理,每片大小在16M到64M。
       2.执行程序包括一个master程序和其他worker程序,共有M个Map任务(分片时确定)和R个Reduce任务,由master节点选择空闲worker分配map或reduce任务。
       3.worker执行map任务过程:读取输入数据,分析出key/value对,传递给map函数,map函数产生中间结果key/value对,存入内存
       4.内存中的中间结果被定时写入到磁盘中,写入的位置通过分区函数计算,一共分散在R个磁盘区上,master节点负责把磁盘位置发送给执行Reduce函数的worker。
       5.执行Reduce的worker通过远程调用从磁盘上获取缓冲数据,并根据中间key排序,把相同的key排(合并)在一起。对于中间结果太大的,执行外排序。
外排序,也就是大文件排序,在外存上将待排序数据分批放入内存排序,数据会在内外存之间多次交换。常用:多路归并。
       6.Reduce worker通过唯一的中间key遍历排序后的中间数据,把key和中间结果值集合传递给reduce函数,reduce函数把本worker的输出写入本分区的的输出文件。
       7.所有map,reduce执行完毕,mapreduce返回用户程序调用点
这R个输出文件可以作为以分区为key的,另一个mapreduce的输入;或作为块文件存储在磁盘中,给其他应用读取

分成M片
M个map和R个reduce
读入片内内容&分析出键值对
分割函数
磁盘位置
根据中间键key排序&相同键合并 -- 通过唯一的中间key遍历排序后的数据
用户输入
进入集群开始拷贝
master分配
空闲的worker
被分配了map任务的worker
中间键值对
缓存到内存
定期写入磁盘R区域
磁盘信息
master节点
Reduce worker节点
L
key和中间结果值集合
reduce函数
本分区的输出文件

3.2 Master节点

       保存每一个Map或者Reduce的状态和不同worker状态的识别任务;存储每一个中间分区的位置和大小。

3.3 容错

3.3.1 失效检测

       worker:采用定时ping每个worker的方式,对于没有按时回复的机器,所有这台机器完成的和正在进行的任务都还原成初始状态,因为中间结果是存放在这台机器的内存中的,一旦失效会导致无法访问和写入磁盘,任务也就白做了。
       master自身:会定时设置checkpoint写出节点状态到磁盘。失效时可以恢复最近的master节点的状态。

3.3.2 失效处理

       分布式执行的输出应该和单个执行的一致,因此采用对map和reduce输出采取原子操作,master节点只会存储一个已完成的map任务的,输出的临时文件的地址信息,其他的map完成信息会被忽略。
       当一个Reduce任务完成,会把临时文件改名为正式的输出文件(覆盖),这里使用文件系统的原子性的重命名操作,确保文件系统中记录的是某一个Reduce任务的输出

3.3.3 文件存储

       GFS会以64M为一块,每块保留三份拷贝,map任务会分配给输入数据的机器或者和包含输入数据拷贝,且在同一个局域网(交换机网段内)的机器上执行。,以此减少网络带宽。

3.3.4 任务颗粒度

       map任务会产生M个中间结果,Reduce任务会产生R个小块。因此需要执行O(M+R)次调度,在内存中保存O(M*R)个状态
在这里插入图片描述
       通常用户会根据实际需要指定输出文件的个数R,M的值则需要根据机器数量调整,使得每一个任务处理16到64MB的数据,提高本地优化率。
常用规模:M=200,000,R=5,000。

3.3.5 备用任务

       对于执行时间超过正常时间的mapreduce任务,master节点会在任务即将结束时,启动备用进程来执行剩下的处理中的任务

4.效率技巧

4.1 分区函数

       对于一般的key,使用hash(key)mod R可以达到均匀负载,如果key是URL,让同一台主机的URL保存到同一个输出文件中,可以提高效率,可以采取hash(hostname(urlkey)mod R),以达到同一个hostname的URL在同一个输出文件中
       可以类比一下bigtable的列家族为什么要采用域名倒置。

4.2 顺序存储

       顺序存储便于随机读取。因此,中间键值对的key是按照key增量处理的。这样便于输出文件格式支持客户端对数据的随机读取或者对输出数据进行再排序

4.3 combiner函数

       对于单词统计这样的map函数,会产生很多(word,1)的中间结果,这些结果通过网络发送给Reduce函数。通过combiner函数,数据可以先在本地合并,再通过网络发送。
       combiner函数在map机器上执行,代码可以和Reduce函数一模一样,但是区别是
combiner函数的输出是写到中间文件,并发送给reduce任务

4.4 输入输出类型

       对于文本文件,输入转换成key:偏移量,value:行内容。
       reader函数封装了输入类型的有效分隔方法(指明分隔符/分割边界),可以便捷的从数据库或内存数据结构中读取数据。
       write也一样,而这都可以通过扩展定自定义数据类型。

4.5 边界效应

       读取一个地址的时候可能会改变改地址的内容。没有实际使用过,但是对于产生多个输出文件而且具有跨文件一致性需求的任务是必须进行以下两个限制:
       1.添加辅助输出文件,有多个输出任务时提供原子边界操作
       2.应用程序写临时文件时,直到文件写完才一次性进行文件改名。

4.6 出错处理:跳过损坏记录

       某些记录会让map/reduce函数crash掉,而bug可能出现在第三方lib中,源码不存在。因此,mapreduce会在检测到让程序crash的记录时,跳过执行这条记录。
       每一个worker处理进程都有一个信号句柄(signal handler),用于捕捉内存段异常和总线错误。在执行map或reduce之前,mapredce函数库通过全局变量保存记录号,如果用户代码产生了异常信号,信号句柄通过UDP向master发送上次处理的,最后一条记录的序号,当这条记录有不止一个失效时,标记这条记录需要跳过。(因为只有一个失效可以执行map和reduce的一个)。

4.8 状态信息

       master节点内有一个HTTP服务器,输出状态报告。例如每种状态(in-processing,idel失效)任务的个数,worker的不同文件的字节数等等。

4.9 计数器

       每个worker有自己的counter值,包括记录已经处理的kv对数量。这些数值定时通过ping传递给master节点,实时显示任务进度。
       mapreduce函数库自动维持这个counter值。
       counter适合检查mapreduce操作的完整性。

对于前面的一些补充

3.2 master数据结构

通过一些数据结构来维护每一个map和reduce任务的工作状态,以及非空闲worker的标识。

master相当于中间文件位置信息传递的,map和reduce人物之间的管道。

对于每个完成的map任务,master存储对应的R个中间文件区域的大小和位置。

这些信息被逐步增加的传递给reduce任务。

数据流中的最大值,因为可能会对任务进行排序和设备负载均衡。

3.3 容错

3.3.1 worker失效

master周期的ping每个woorker,一段时间内没有返回的worker被标记为失效。

失效worker完成的所有map任务,和正在进行的map或reduce任务回归初始状态,分配给其他worker。

因为map任务的输出在节点设备自己的磁盘上,已经不可访问。

失效worker完成的reduce任务已经输出到全局文件系统,不需要再次执行。

map任务更换执行worker时,会通知所有执行reduce任务的worker,任何从原设备读取数据,但尚未开始的reduce任务从新worker读取数据。

3.3.2 master失效

管理者周期性的把当前master状态写入checkpoints的数据结构,master失效从上一个checkpoint开始启动另一个master进程

Google的实现:master失效,停止mapreduce任务,由用户检查状态并手动重新执行。

3.3 出错处理机制

map,reduce函数如果输出函数是确定值,分布式执行和顺序执行的结果是相同的。

分布式计算采取了原子提交来确保一致性。

每个任务把输出写入到私有临时文件,map产生R个,reduce产生一个。

map任务完成,传递R个文件的名字给master节点,记录在master数据结构中。

reduce任务完成,由reduce worker原子的把临时文件重命名为最终输出文件。

多个节点执行相同的reduce任务(文件分成map任务之后,在集群内大量复制)时,通过原子重命名操作,确保最终文件系统只包含一个reduce任务的数据。

3.3.1 当map和reduce操作不确定时

不同机器上执行的同一个reduce函数可能得出不同的,不符合非确定顺序程序(随机数程序)的输出。

补一张图。

3.4 存储位置

为了节约带宽,把输入数据通过GFS分成64M的块,每个块的三个拷贝放在集群的不同节点上。

master节点记录输入文件位置信息,优先分配包含相关输入的节点执行map任务,否则找靠的近的节点。

本地读取数据不消耗网络带宽。

3.5 任务粒度

worker通过执行不同的任务来提高动态负载均衡;加快从失效worker的恢复。

master需要做O(M+R)次调度,保存O(M*R)个状态在内存中。

这些存储状态片很小,一个map或reduce只一个字节。

3.6 备用任务

mapreduce会被落后者限制效率。(落后者:一个本地CPU,磁盘,内存故障,网络带宽出现问题,导致代码执行慢)

备用任务机制:在MapReduce任务接近完成时,启用备用进程执行剩下的任务,任务不需要标记是谁完成的。

4.技巧

4.1 分割函数

用户需要指定reduce任务和reduce任务输出文件的数量。

平衡分割:
h a s h ( k e y ) m o d R hash(key) mod R hash(key)modR
其他分割’例如输出key是URLs,希望每台主机的条目保存在一个文件里。
h a s h ( H o s t n a m e ( u r l k e y ) ) m o d R hash(Hostname(urlkey)) mod R hash(Hostname(urlkey))modR

4.2 文件顺序性保证

每一个map任务的中间(key,value)以key递增顺序处理,以保证得到有序的输出文件,便于

输出文件需要有效率的随机访问key和再排序。

4.3 combiner函数

词频率统计,每个map任务会出现大量的<the,1>,如果通过网络传给reduce任务在合并,浪费网络资源,因此本地合并再发送。

一般combiner函数和reduce函数代码相同,区别是MapReduce库控制二者的输出。

combiner函数输出到中间文件,发给reduce任务。

reduce函数直接输出到最终输出文件。

4.4 输入输出类型

如何针对不同的输入类型,把输入分割成对每个map任务是有意义的(文本文件的输入,在每行边界进行分割。)

用户自定义reader接口来实现不同输入类型的读取。

可以从文件,数据库,内存数据结构读取输入。

4.5 副作用,辅助文件

在map或reduce任务时,产生辅助文件,作为附加输出。

通过应用程序来写入附加文件来保证原子性。应用程序写完一个临时文件,临时文件就会自动被重命名。

4.6 错误记录跳过

可能因为第三方库源代码问题或用户bug,在某一个记录上的map或reduce函数上程序崩溃,因此,MapReduce库检测引起crash的记录,跳过。

每个worker通过一个信号处理器来处理内存段异常和总线错误。

在调用用户自定义的map和reduce函数之前,MapReduce库把这条记录的序列号记录在全局变量里,如果用户代码产生出错信号,信号处理器就发送一条包含序列号的”last gasp“UDP给master节点,下一次master看到这个记录时,就会跳过这条记录的map和reduce函数。

4.7 本地执行

为了简化和调试,用户用一个标志调试程序。

4.8 状态调试信息

master运行一个HTTP服务器,输出一组状态页,显示计算进度(pycharm的机器学习库),包含任务数,处理百分比等等。这个页也包含到标准错误的链接每个任务标准输出的链接

用户根据这些来估计时间和动态调整系统资源分配。

最上面的状态页标注了失效的worker和失效时正在执行的map或reduce任务,用户调试bug时用。

4.9 计数器!

MapReduce库用来计算各种事件发生次数的计数器工具。

Counter * uppercase;
uppercase = GetCounter("uppercase");
for each word w in contents:
	if(isCapitalized(w)):
		uppercase->increment();
	EmitIntermediate(w,"1");

统计包含大写字母单词出现的次数。

每个worker周期性把自己计数器的值传给master(在ping回应里)。

在所有mapreduce完成后,master返回给用户代码。

当前计数器的值在状态页里。

MapReduce库自动维护一些计数器,比如被处理的key\value对数量和被产生的输出key\value对数量。

计数器也可以为用户提供完整性检查。

例如,一些用户代码希望输出对数量完全等于输入对数量(之前举例子的直通reduce函数),

或者希望处理过的文档在所有要处理的文档中占合适比重。

5.性能

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星辰的野望

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

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

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

打赏作者

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

抵扣说明:

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

余额充值