MapReduce面试题参考答案(一)

原文作者:董西成  点击阅读原文

 

昨天给大家发了几道MapReduce面试题,今天将答案分享给大家。需要注意的是,这是面试题,不是笔试题,面试题重在表达和交流,所以答得好坏取决于你当时的表现,今天仅是简单地将答案关键点发个大家,如果你遇到了这些面试题,需要自行扩展和丰富这几个关键点。

题目1:如果非要写mapreduce程序完成,则需要转化为两个maprecuce作业,第一个是wordcount,第二个是top K,第一个作业很简单,第二个作业的map阶段可使用大顶堆统计每片数据的top K,reduce阶段由一个task汇总top K的top K。优化点有:wordcount作业使用combiner减小map输出数据量,或者使用其他计算模型优化,比如spark、Tez等,这样,第一个作业的数据无需写到HDFS上,直接传递给第二个作业,可大大节省磁盘IO。

题目2:mapreduce程序很容易写,不再赘述。

(1) Map Task输出大量数据量,会导致每个MapTask溢写(spill)磁盘多次,由于每个map task会将所有溢写文件合并成一个文件,因此会至少读写磁盘两次,大大增加IO,严重降低效率。优化方法有:对查询词编码,以减少IO;利用词频表减少不必要的读写等等。

(2)在Map Task输出时,不再输出低频词出现的词对

(3)对查询词编码,使用map保存;使用Trie树等

(4)可借助外部系统,比如redis、memcache等

题目3:可参考基于mapreduce的开源图算法库Apache Giraph。

题目4: DistributedCache,即分布式缓存,原理是借助HDFS实现数据分发功能,实际上是一个磁盘(不是内存)缓存实现,具体可参考我的书《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》第五章

题目5:shuffle工作流程和优化方法可参考我的书《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》第八章。

题目6:由InputFormat决定。默认情况下采用TextInputFormat,MapTask个数由block size、min inputsplit和max inputsplit决定。

题目7:数据本地性是指优先将任务调度到数据所在的节点上,这样可避免跨网络读取数据,从而提高任务运行效率。数据本地性分为节点本地性(node locality)和机架本地性(rack locality)两种。提高数据本性的方法有:delay scheduling(有相关论文,可自行查找)、增加数据副本数等。

题目8:可分别分析JobTracker、TaskTracker、Task等组件的容错性。

题目9:Partitioner的作用是决定Map Task产生的数据记录交给哪个Reduce Task处理。默认实现是:(key)mod R,其中R是Reduce Task个数。一般情况下,当需要按照key的一部分(不是全部,比如key的前三个字节)进行partition,或者按照key范围进行partition时,需要自定义Partitioner。

题目10:Combiner位于Map Task中,相当于local reducer,通常跟Reducer逻辑一样,作用是对Map Task数据进行局部汇总或者规约,以减少数据输出量。

 

你可能感兴趣的:(面试,MapReduce)