文章目录
-
- MapReduce问答题
-
- 一、描述一下手写MR的大概流程和规范
- 二、如何实现Hadoop中的序列化,以及Hadoop的序列化和Java的序列化有什么区别?
- 三、概述一下MR程序的执行流程
- 四、InputFormat负责数据写的时候要进行切片,为什么切片大小默认是128M
- 五、描述一下切片的逻辑(从源码角度描述)
- 六、CombineTextInputFormat机制是怎么实现的
- 七、阐述一下 Shuffle机制流程?
- 八、在MR程序中由谁来决定分区的数量,哪个阶段环节会开始往分区中写数据?
- 九、阐述MR中实现分区的思路(从源码角度分析)
- 十、描述一下Hadoop中实现排序比较的规则(源码角度分析)
- 十一、Hadoop中实现排序的两种方案分别是什么?
- 十二、编写MR的时候什么情况下使用Combiner,具体实现流程是什么?
- 十三、OutputFormat自定义实现流程描述一下
- 十四、MR实现 ReduceJoin 的思路,以及ReduceJoin方案有哪些不足?
- 十五、MR实现 MapJoin 的思路,以及MapJoin的局限性是什么?
MapReduce问答题
一、描述一下手写MR的大概流程和规范
写mapper类
- 继承Hadoop提供的Mapper类
- 重写map()方法
- 在map()方法中写业务逻辑
- context对象输出<k,v>
写reducer类
- 继承Hadoop提供的Reducer类
- 重写reduce()方法
- 在reduce()方法中写业务逻辑
- context对象输出<k,v>到结果文件
写driver类
- 编写MR作业提交流程和自定以配置项目
二、如何实现Hadoop中的序列化,以及Hadoop的序列化和Java的序列化有什么区别?
实现:
- 在具体bean对象中实现Writable接口
- 写无参构造
- 重写序列化、反序列化方法下
区别:
Java的序列化比较重量级,会对类数据及类的继承结构等信息全部序列化传递
而Hadoop只序列化类的数据,轻量高效
三、概述一下MR程序的执行流程
InputFormat读取HDFS中的数据文件,并在内部切片,每一个切片对应搞一个MT任务,MT按照文件逐行处理数据,每一行数据调用一次Mapper里我们自定义的map()方法,而map()方法里是我们自己写的处理逻辑,但主要任务还是把数据通过context对象输出到磁盘里
在MT处理完数据、RT开始前,数据会走一趟shuffle
数据走完shuffle之后,RT会先把MT处理完的数据拷贝一份,每一组相同key的values调用一次Reducer类里边我们自定义的reduce()方法,数据处理完之后通过OutputFormat把结果数据再写到磁盘上
四、InputFormat负责数据写的时候要进行切片,为什么切片大小默认是128M
切片大小是由minSize,MaxSize,blockSize三个参数调整决定的,默认切片大小为blocksize大小=128M,而如果读数据的时候切片大小不等于块大小,在集群环境下可能会造成跨机器读数据的情况,这样会造成额外的资源消耗,拖慢整体MR程序执行效率,因此如果切片大小为块大小,一次读数据读一块就会避免上述情况。
五、描述一下切片的逻辑(从源码角度描述)
FileInputFormat----->getSplits()
-
找到数据存储的目录,把待处理的输入数据的元数据信息放入一个集合
-
开始遍历待处理目录下的每一个文件,默认不忽略处理子目录
-
切片计算规则:minSize、MaxSize和