解密MapReduce(下集

digest [复制链接]
发表于 : 2018-12-29 14:15:38 最新回复:2019-01-02 10:00:29
461 1

在《解密MapReduce(上集)》当中,我以神秘扑克牌做类比简单地跟大家解说了一下MapReduce的工作原理,不知道大家是否记忆犹新呢?


OK,今天我们就趁热打铁,把一些细节的内容也分享给大家!首先我们提出第一个问题:我们说,在client将任务提交给集群处理之前,需要先对文件进行分片,那么这个分片是根据什么来分的呢?后续又是怎样将文件处理的任务分配给Map进程的呢?


——正确答案:提交任务的PC是Hadoop集群的客户端,客户端在提交任务之前要先将待处理的文件进行分片(Split)。我们的文件存放在HDFS中,而HDFS中的数据是按照数据块的形式分散存放在各个服务器里面的,不懂没关系,上图~


1


MR框架默认将一个数据块(Block)作为一个分片。分片是一个逻辑的概念,每个Map处理一个分片。比如说,第一个Map处理第一个分片,这个分片是从文件的开始,也就是偏移量为0的位置读取到偏移量为128M的位置;第二个Map处理第二个分片,这个分片是从偏移量128M读到偏移量256M,每一个分片对应启动一个Map来对其进行处理。


Map是一个计算程序,计算逻辑是由我们做大数据应用开发的人编写出来的。我们是在自己的PC上编写代码,编好了以后就要把代码提交到集群上去。提交给谁呢?提交给Yarn,这是一个资源管理模块,他会为我们的任务执行分配资源。Yarn它会根据我们要处理的文件分布在哪些节点上,而在这些节点上启动相对应的Map程序。因此Map进程也是分散在集群当中的,这样就达到了分布式并发执行的效果哦!


至此为止,问题又来了:我们划分文件的目的是什么?


——正确答案:第一,做分布式运算,让计算变得更加高效,众人拾柴火焰高;第二,由于文件分散在集群当中,如果只有一个节点计算数据的话,就必须把数据集合到这个节点上来,这样子做网络代价会很大。


2


最后呢,我们来把这个过程的细节问题补充完整!


首先第一个细节,就是这个文件被处理之前,也就是在启动MapReduce之前,必须确保待处理的文件放在HDFS上面。不然的话,计算节点没有数据,分布式计算就没法执行了。


第二个细节,Map的输出先放入一个环形内存缓冲区,当缓冲区数据溢出时,需将缓冲区中的数据写入到本地磁盘,写入本地磁盘之前通常需要做如下处理:


1.分区(Partition)---默认采用Hash算法进行分区,现在我记录了hello,world等等一些单词对吧。我对每一个单词求hash值,然后用这个hash值除以Reduce的个数并取余,Reduce的个数就等于分区的个数,每个Reduce对应一个分区。得到的余数就是最终要把这个单词放到哪一个分区。我们知道,Hash算法的特点就是相同的对象求出来的值是一样的,所以相同的单词最终被送到相同的Reduce来处理。


这个过程稍微有一点点不好理解,没关系,一言不合就上图!


3


2.排序(Sort)---将Map输出的记录排序,例如将(’Hi’,’1’),(‘Hello’,’1’)重新排序为(‘Hello’,’1’), (’Hi’,’1’)。


3.组合(Combine)---这个动作MR框架默认是可选的。但是数据量很大的时候建议大家去做。这个就是每个Map要完成的一个统计的过程,例如将(’Hi’,’1’), (’Hi’,’1’),(‘Hello’,’1’), (Hello’,’1’)进行合并操作为(’Hi’,’2’), (‘Hello’,’2’)。


4.合并(Spill)---Map在处理后会产生很多的溢出文件(spill file),这时需将多个溢出文件进行合并处理,生成一个经过分区和排序的SpillFile(MOF:MapOutFile)。为减少写入磁盘的数据量,MR支持对MOF进行压缩后再写入。至此,Map的任务就算是完成啦!上图,总结一下~


4


现在继续第三个细节,通常在Map 任务完成MOF输出进度到3%时启动Reduce,Reduce会去读取Map的输出文件MOF里面属于自己的分区,把这部分数据copy到自己的内存当中来。每一个Reduce会对应一个分区,然后去做后续的处理。这是一个copy的过程;


当Reduce接收的数据量不大时,则直接存放在内存缓冲区中,随着缓冲区接收到的文件增多,Reduce要对接收到的MOF文件进行一个排序和合并,生成更大的文件。这是一个sort和merge的过程。


copy和sort、merge的过程我们一般统称为一个shuffle的过程,这个过程中会产生许多中间文件,最后一次合并的结果直接输出到用户自定义的Reduce函数。Reduce对合并后的文件进行处理,计算出我们需要的结果。


那么现在大家想想,为什么需要shuffle的过程呢?


——正确答案:大家考虑一下一个分区有好几个不同单词的情况,而且每一个Map都会输出一部分结果到同一个Reduce上,如果没有shffle的过程场面该有多么的混乱。


很好,现在我们已经解决不少问题啦,最后,完整的过程图双手奉上~大家要把每一个步骤看仔细哦!


5


这就是MapReduce的一个完整的流程。其实很简单吧,只是有很多细节地方需要注意一下~ So,今天的<下集>到这里就结束啦!欢迎大家指正补充哦!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
  • x
  • 常规:

点评 回复

QQ:3063089331
跳转到指定楼层
Becky_2019
Becky_2019  管理员 发表于 2019-1-2 10:00:29 已赞(0) 赞(0)

感谢分享!
  • x
  • 常规:

点评 回复

发表回复
您需要登录后才可以回帖 登录 | 注册

警告 内容安全提示:尊敬的用户您好,为了保障您、社区及第三方的合法权益,请勿发布可能给各方带来法律风险的内容,包括但不限于政治敏感内容,涉黄赌毒内容,泄露、侵犯他人商业秘密的内容,侵犯他人商标、版本、专利等知识产权的内容,侵犯个人隐私的内容等。也请勿向他人共享您的账号及密码,通过您的账号执行的所有操作,将视同您本人的行为,由您本人承担操作后果。详情请参看“隐私声明
如果附件按钮无法使用,请将Adobe Flash Player 更新到最新版本!
登录参与交流分享

登录参与交流分享

登录