面试必问 | 一文轻松搞定MapReduceHQL执行原理

Posted 数据仓库与Python大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试必问 | 一文轻松搞定MapReduceHQL执行原理相关的知识,希望对你有一定的参考价值。


如果你是一名数据工程师,还是一名吃货,那这篇文章应该没那么枯燥了。


今天用日料Sushi来一起走进MapReduce与HQL执行过程!轻松愉快美味~


##Ps:本人是个吃货(但人又很瘦的那种),尤其爱吃刺身日料,而且一说到吃就很激动,小胃已经锻炼的杠杠的了。

       

先简单介绍一下什么是Sushi,就是寿司。寿司也分很多种,本次就用手握寿司来生动形象的描述MR的原理和过程。



  进入MapReduce之前的阶段  


因为是对比讲解,所以从准备阶段开始,在准备阶段我们要准备好食材,食材就好比我们准备阶段的数据,食材有好有坏,数据同样也有好坏之分,一般想要得出的数据准确无误,都要准备“上好食材”,脏数据差数据尽可能避免,做好的sushi重点也是要好原料,新鲜度和品质占一部分,厨师的手艺也很关键。


我们这里分3个厨师吧,分别叫:M、S、R。

       

开始说下我们的原料食材,要做手握寿司,三文鱼、金枪鱼、干海苔、鱼子酱、山葵酱、醋饭,其他小的细节就不提了,而且也只用两种鱼类做参考。

准备好这些“数据”后开始进入下一阶段。



  M厨师的Map阶段  


整块三文鱼和金枪鱼放到面前,开切!切鱼也有很多讲究(刀、角度、还有姿势),在这里就不过多描述了,每片切1厘米左右,备用。

       

转回来在MapReduce中,首先M厨师上场,根据文件个数分配Mapper Task个数,M厨师依照下图SQL,再根据自己的手法做切分,当然手法是固定的,不能有偏见。主料和配料都会在这步做切分。

       

这一步主要是根据不同的鱼类进行切分,每个种类应切多少片呢,一般是按照DFS块大小来切,当然也可以用这个参数mapred.min.split.size自定义。


(join,SQL:select u.name, o.orderid from order o join user u on o.uid = u.uid;普通两表join,只要在value上打上标记就可以了)


面试必问 | 一文轻松搞定MapReduce、HQL执行原理

(group by,SQL:select uid, name, count(*) from student group by uid, name;将GroupBy的字段组合为map的输出key值)


面试必问 | 一文轻松搞定MapReduce、HQL执行原理

(count(distinct),SQL:select name, count(distinct uid) cnt from student group by name;将GroupBy字段和Distinct字段组合为map输出key)



  下一步到S厨师,Shuffle阶段。

(本次没让负责Combine阶段的C厨师介入)  


这步非常关键!也是最核心的,为什么核心呢?是因为衔接Map阶段和Reduce阶段之间的,核心的中间桥梁。

       

这一步是对食材进行分类,分类为什么核心,这次分类不是按照同种类区分,而是按照最终呈现的菜品进行分类。比如一贯寿司中,要几片干海苔,几片三文鱼,多少量的饭,多少量的鱼子酱等等。要注意的是,S厨师只是进行分类,并不负责将这些食材组合成最终的菜品,最终组合是R厨师的工作。试想一下,如果S厨师没学习过日料厨艺,也没吃过寿司,可能就会在某一贯寿司上分10片三文鱼,在另一贯寿司上分2片三文鱼,(可能是有自家亲戚或哥们来关顾才会这么分吧),这样分类会给R厨师造成很大难度,这种情况一会详细介绍。

       

转回到在MapReduce中,S厨师依据最终菜品进行食材分类,分类手法也是不一样的,根据SQL分不同方式分类,Shuffle阶段细分的话会分Map Task阶段的Shuffle和Reduce Task阶段的Shuffle:


Mapper Task输出时会开启一个环形内存缓冲区,并且在配置文件里有个设定的阈值(默认80%,可以改),当发现使用量到达这个内存阈值的时候,就会把这80%的内容写到磁盘上,这个过程叫分隔,Map Shuffle过程过后会生成1个或者多个分隔文件


Reduce Task输入时会分为两个任务:

1.Copy Map输出:直接Copy Map Shuffle的最后一步

2.Merge:基于JVM的heap size设置的内存缓冲区


最后Reduce Task不断合并后,会写到内存中或者磁盘中

面试必问 | 一文轻松搞定MapReduce、HQL执行原理

(join,SQL:select u.name, o.orderid from order o join user u on o.uid = u.uid;每个Mapper Task按照key进行分类)


面试必问 | 一文轻松搞定MapReduce、HQL执行原理

(group by,SQL:select uid, name, count(*) cnt  from student group by uid, name;同样按照Key值分类)


面试必问 | 一文轻松搞定MapReduce、HQL执行原理

(count(distinct),SQL:select name, count(distinct uid) cnt from student group by name;这里图中保留出partition key,大家能看的清楚些,和Group by 不同的是会将distinct字段和group by字段全部已key的形式放到内存中,数据量大的时候会造成“内急”OOM情况,所以很多时候要避免count和distinct的cp组合)



  最后到R厨师,Reduce阶段  


组合排序,这一步将S厨师分类出的食材进行最终组合,组合成最终菜品展现给顾客,M、S、R三个厨师都只做自己的工作,不会有相互的交流(甚至连眼神的那种都没有),上游给到什么就做什么,这就是机器干活的弊端。最终三文鱼寿司,实在是不好描述,给大家个搜狗emoji

以上是关于面试必问 | 一文轻松搞定MapReduceHQL执行原理的主要内容,如果未能解决你的问题,请参考以下文章

java面试必问:多线程的实现和同步机制,一文帮你搞定多线程编程

2021年百度Java面试真题,一文轻松搞定

一文搞定HashMap的实现原理和面试

程序员面试防坑宝典,带你手撸红黑树,一文轻松搞定

三分钟带你入门redis高可用架构之哨兵模式,一文轻松搞定

字节Java面试必问:java在线编辑器小白下载教程