我曾经面试过100+家公司,没有任何一家公司没有问过MapReduce的相关问题***
由于我一直都是专注于大数据面试题的分享,所以我还是直接从面试问题出发来带大家了解MapReduce
1. MapReduce的工作原理
1.1 理论分析
- map阶段:首先通过InputFormat把输入目录下的文件进行逻辑切片,默认大小等于block大小,并且每一个切片由一个maptask来处理,同时将切片中的数据解析成<key,value>的键值对,k表示偏移量,v表示一行内容;紧接着调用Mapper类中的map方法。将每一行内容进行处理,解析为<k,v>的键值对,在wordCount案例中,k表示单词,v表示数字1 ;
- shuffle阶段:
- map端shuffle:将map后的<k,v>写入环形缓冲区【默认100m】,一半写元数据信息(key的起始位置,value的起始位置,value的长度,partition号),一半写<k,v>数据,等到达80%的时候,就要进行spill溢写操作,溢写之前需要对key按照分区进行快速排序【分区算法默认是HashPartitioner,分区号是根据key的hashcode对reduce task个数取模得到的。这时候有一个优化方法可选,combiner合并,就是预聚合的操作,将有相同Key 的Value 合并起来, 减少溢写到磁盘的数据量,只能用来累加、最大值使用,不能在求平均值的时候使用】;然后溢写到文件中,并且进行merge归并排序(多个溢写文件);
- reduce端shuffle:reduce会拉取copy同一分区的各个maptask的结果到内存中,如果放不下,就会溢写到磁盘上;然后对内存和磁盘上的数据进行merge归并排序(这样就可以满足将key相同的数据聚在一起); 【Merge有3种形式,分别是内存到内存,内存到磁盘,磁盘到磁盘。默认情况下第一种形式不启用,第二种Merge方式一直在运行(spill阶段)直到结束,然后启用第三种磁盘到磁盘的Merge方式生成最终的文件。】
- reduce阶段:key相同的数据会调用一次reduce方法,每次调用产生一个键值对,最后将这些键值对写入到HDFS文件中。
1.2 示例分析

2. GroupBy的工作原理
- map阶段:将group by后的字段组合作为key,如果group by单字段那么key就一个。将group by之后要进行的聚合操作字段作为值。【如要进行count,则value是1;如要sum另一个字段,则value就是该字段】
- shuffle阶段:按照key的不同分发到不同的reducer。
- reduce阶段,将相同key的值累加或作其他需要的聚合操作,得到结果。
select rank, isonline, count(*) from city group by rank, isonline;

3. Distinct的工作原理
- 首先将group by的字段和distinct的字段组合在一起作为map输出的key,value设置为1,同时将group by的字段定为分区键,这可以确保相同group by字段的记录都分到同一个reducer,并且map的输入天然就是按照组合key排好序的。
- 根据分区键将记录分发到reduce端后,按顺序取出组合键中的distinct字段,这时distinct字段也是排好序的。
- 依次遍历distinct字段,每找到一个不同值,计数器就自增1,即可得到count distinct结果。
select dealid, count(distinct uid) as num from order group by dealid;

4. Join的工作原理
4.1 map join
- 原理:将小表复制多份,让每个map task内存中存在一份(比如存放到HashMap中),然后只扫描大表:对于大表中的每一条记录key/value,在HashMap中查找是否有相同的key的记录,如果有,则join连接后输出即可。

4.2 reduce join
- map阶段:对来自不同表的数据打标签,然后用连接字段作为key,其余部分和标签作为value,最后进行输出
- shuffle阶段:根据key的值进行hash,这样就可以将key相同的送入一个reduce中
- reduce阶段的主要工作:同一个key的数据会调用一次reduce方法,就是对来自不同表的数据进行笛卡尔积
SELECT u.name, o.orderid FROM user u JOIN order o ON u.uid = o.uid;

5. 你知道哪些调优参数

6. 整个MapReduce发生了几次排序
- 根据前面提到的MapReduce的原理可知,共三次排序:map端的shuffle发生了一次快速排序和一次归并排序,reduce端的shuffle发生了一次归并排序。
思考题:整个MapReduce发生了几次落盘操作?
#数据人的面试交流地##大数据开发##24届软开秋招面试经验大赏##我发现了面试通关密码##实习#