1. 简述Map包含哪些步骤?
参考答案:(1)读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。(2) 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。(3)对输出的key、value进行分区。(4)对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。(5)分组后的数据进行归约。
2. 简述Reduce包含哪些步骤?
参考答案:(1)对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。(2)对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。(3)把reduce的输出保存到文件中。
3. MapReduce中排序发生在哪几个阶段?这些排序是否可以避免,为什么?
参考答案:一个MapReduce作业由Map阶段和Reduce阶段两部分组成,这两阶段会对数据排序,从这个意义上说,MapReduce框架本质就 是一个Distributed Sort。在Map阶段,Map Task会在本地磁盘输出一个按照key排序(采用的是快速排序)的文件(中间可能产生多个文件,但最终会合并成一个); 在Reduce阶段,每个 Reduce Task会对收到的数据排序,数据便按照Key分成了若干组,之后以组为单位交给reduce处理。很多人的误解在Map阶段,如果不使用 Combiner便不会排序,这是错误的,不管你用不用Combiner,Map Task均会对产生的数据排序(如果没有Reduce Task,则不会排序, 实际上Map阶段的排序就是为了减轻Reduce端排序负载)。由于这些排序是MapReduce自动完成的,用户无法控制。因此,在hadoop 1.x中无法避免,也不可以关闭,但hadoop2.x是可以关闭的。
4. 编写MapReduce作业时,如何做到在Reduce阶段,先对Key排序,再对Value排序?
参考答案:该问题通常称为”二次排序“,最常用的方法是将Value放到Key中,实现一个组合Key,然后自定义Key排序规则(为Key实现一个WritableComparable)
5.如何使用MapReduce实现两个表join,可以考虑一下几种情况:(1)一个表大,一个表小(可放到内存中);(2)两个表都是大表。
参考答案:第一种情况比较简单,只需将小表放到DistributedCache中即可;第二种情况常用的方法有:map-side join(要求输入数据有序,通常用户Hbase中的数据表连接),reduce-side join,semi join(半连接)。



