建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块
直达楼层
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

采纳成功

您已采纳当前回复为最佳回复

建赟

发帖: 692粉丝: 49

发消息 + 关注

发表于2018年12月19日 14:07:00 7304 4
直达本楼层的链接
楼主
显示全部楼层
[技术干货] 叶子解密MapReduce(下集)

作者叶子是一位90后,天秤座,大数据&人工智能美女讲师。钟情创作,相信一切感受皆是生命的体验,坚持在朴素的文字中寻找生活的出路。是一位集才气于一身的大美女。

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


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


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


image.png


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


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


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


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


image.png


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


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


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


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


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


image.png


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的任务就算是完成啦!上图,总结一下~


image.png


现在继续第三个细节,通常在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的过程场面该有多么的混乱。


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


1.jpg


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

个人订阅号“叶子的浅浅时光”,集文学作品和技术文章于一体。读者叹之:才学傲须眉,妙笔若行云。


image.png


举报
分享

分享文章到朋友圈

分享文章到微博

采纳成功

您已采纳当前回复为最佳回复

建赟

发帖: 692粉丝: 49

发消息 + 关注

发表于2018年12月19日 14:09:48
直达本楼层的链接
沙发
显示全部楼层

技术好文章,大家值得一看

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

Joey啊

发帖: 84粉丝: 16

级别 : 版主

发消息 + 关注

发表于2019年08月31日 10:14:46
直达本楼层的链接
地板
显示全部楼层

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

Joey啊

发帖: 84粉丝: 16

级别 : 版主

发消息 + 关注

发表于2019年08月31日 10:15:43
直达本楼层的链接
5#
显示全部楼层

点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册

结贴

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200