当前位置:   article > 正文

大数据技术原理与应用林子雨版第七章课后答案_林子雨mapreduce编程题

林子雨mapreduce编程题

1.试述MapReduceHadoop的关系。

Google公司最先提出了分布式并行编程模型MapRedece ,Hadoop是一个实现了MapReduce模式的开源的分布式并行编程框架。Google的MapReduce运行在分布式文件系统GFS上,与Google类似,HadoopMapReduce运行在分布式文件系统HDFS上。相对而言,HadoopMapReduce要比GoogleMapReduce使用门槛低很多,程序员即使没有任何分布式程序开发经验,也可以很轻松地开发出分布式程序并部署到计算机集群中。

2.MapReduce 是处理大数据的有力工具,但不是每个任务都可以使用MapReduce 来进行处理。试述适合用MapReduce来处理的任务或者数据集需满足怎样的要求。

待处理的数据集可以分解成许多小的数据集,而且每个小数据集可以完全并行地进行处理。

3.MapRednce计算模型的核心是 Map 函数和 Reduce 函数,试述这两个函数各自输入、输出以及处理过程。

Map函数的输入是来自于分布式文件系统的文件块,这些文件块的格式是任意的,可以是文档,也可以是二进制格式。文件块是一系列元素的集合,这些元素是任意类型的,同一个元素不能跨文件块存储。Map函 数将输入的元素转换成<key,value>形式的键值对,键和值的类型也是任意的,其中,键不同于一般的标志属性,即键没有唯一性,不能作为输出的身份标识,即使是同一输入元素,也可通过一个Map任务生成具有相同键的多个<key,value>。

Reduce函数的任务就是将输入的一-系列具有相同键的键值对以某种方式组合起来,输出处理后的键值对,输出结果会合并成一个文件。用户可以指定Reduce任务的个数(如n个),并通知实现系统,然后主控进程通常会选择一个Hash函数,Map任务输出的每个键都会经过Hash函数计算,并根据哈希结果将该键值对输入相应的Reduce任务来处理。对于处理键为k的Reduce任务的输入形式为<K,<v1,v2,…,vn>>.,输出为<k,V>。

4.试述MpReduce 的工作流程(需包括提交任务、MapShuffle Reduce 的过程。

1) MapReduce框架使用InputFormat模块做Map前的预处理,然后将输入文件切分为逻辑上的多个InputSplit。

2) 通过RecordReader根据InputSplit中的信息来处理InputSplit中的具体记录,加载数据并转换为适合Map任务读取的键值对,输入给Map任务。

3) Map任务会根据用户自定义的映射规则,输出一系列的<key, value>作为中间结果。

4) Shuffle:对Map的输出进行一定的分区、排序、合并、归并等操作,得到<key,value-list>形式的中间结果,再交给对应的Reduce进行处理。

5) Reduce以一系列<key, value-list>中间结果作为输入,执行用户定义的逻辑,输出结果给OutputFormat模块。

6) OutputFormat模块会验证输出目录是否存在以及输出结果类型是否符合配置文件中的配置类型,如果都满足,就输出Reduce的结果到分布式文件系统

5.Shuffle过程是 MapReduee 工作流程的核心,也被称为奇迹发生的地方,试分析Shuffle过程的作用。

【答案1

Shufle,是指对Map输出结果进行分区、排序、合并等处理并交给Reduce的过程。Shuffle 过程分为Map端的操作和Reduce端的操作。

1. 在Map端的Shuffle过程。Map的输出结果首先被写入缓存,当缓存满时,就启动溢写操作,把缓存中的数据写入磁盘文件,并清空缓存。当启动溢写操作时,首先需要把缓存中的数据进行分区,然后对每个分区的数据进行排序(Sort)和合并(Combine),之后再写入磁盘文件。每次溢写操作会生成一个新的磁盘文件,随着Map任务的执行,磁盘中就会生成多个溢写文件。在Map任务全部结束之前,这些溢写文件会被归并(Merge)成一个大的磁盘文件,然后,通知相应的Reduce任务来领取属于自己处理的数据。

2. 在Reduce端的Shuffle 过程。Reduce任务从Map端的不同Map机器领回属于自己处理的那部分数据,然后对数据进行归并(Merge)后交给Reduce处理。

【答案2

将Map输出结果进行分区、排序、合并等处理并交给Reduce的过程,减少磁盘I/O的读写次数,并减小从Map到Reduce之间的数据传递量。

6. 分别描述 Map Reduce 端的 Shume 过程(需包括滥写、排序、归并、领取的过程)

Map端:输入数据和执行map任务、写入缓存、溢写(分区、排序和合并)、文件归并

Map的输出结果首先被写入缓存,当缓存满时就启动溢写操作,把缓存中的数据写入磁盘文件,并清空缓存。当启动溢写操作时,首先需要把缓存中的数据进行分区,然后对每个分区的数据进行排序和合并,之后再写入磁盘文件。每次溢写操作会生成一个新的磁盘文件,随着Map任务的执行,磁盘中就会生成多个溢写文件。在Map任务全部结束之前,这些溢写文件会被归并成一个大的磁盘文件,然后通知相应的Reduce任务来领取自己处理的数据。

Reduce端:领取数据、归并数据、把数据输入给Reduce任务

Reduce任务从Map端的不同Map机器领会属于自己处理的那部分数据,然后对数据进行归并后交给Reduce处理。

7.MapReduce中有这样一个原则:移动计算比移动数据更经济。试述什么是本地计算,并分析为何要采用本地计算。

MapReduce设计的一个理念就是计算向数据靠拢,而不是数据向计算靠拢,因为移动数据需要大量的网络传输开销,尤其是在大规模数据环境下,这种开销尤为惊人,因此移动计算比移动数据更加实惠,即将计算节点和存储节点放在一起运行。
    本地计算:在一个集群中,只要有可能,MapReduce框架就会将Map程序就近地在HDFS数据所在的节点运行,从而减少节点间的数据移动开销。

8.试说明一个MapReduce程序在运行期间,所启动的Map任务数量和Reduce 任务数量各是由什么因素决定的。

【答案1

MapReduce的核心思想可以用分而治之来描述,一个大的MapReduce作业,首先会被拆分成许多个Map任务在多台机器上并行执行,即Map任务的数量取决于mapReduce作业的大小。Map任务结束后,会生成以<key,value>形式表示的许多中间结果。

然后,这些中间结果会被分发到多个Reduce任务在多台机器上并行执行,具有相同key<key,value>会被发送到同一个Reduce任务那里,Reduce任务会对中间结果进行汇总计算得到最后结果,并输出到分布式文件系统中。即reduce的任务数量取决于Map输出结果中key的数量。

【答案2

Map任务数量:输入文件数目、输入文件的大小、配置参数。
Reduce任务数量:配置参数。

9.是否所有的MapReduce程序都需要经过MapReduce这两个过程?如果不是,请举例说明。 

不是。例如对于关系的选择运算,只需要Map过程就能实现。对于关系R中的每个元祖t,检测是否是满足条件的所需元祖,如果满足条件,则输出键值对<t, t>,也就是说,键和值都是t。这时的Reduce函数就只是一个恒等式,对输入不作任何变换就直接输出。

10.试分析为何采用Combiner可以减少数据传输量?是否所有的MapReduce程序都可以采用Combiner?为什么?

对于每个分区内的所有键值对,后台线程会根据key对它们进行内存排序(Sort),排序是MapReduce 的默认操作。排序结束后,还包含一个可选的合并(Combine)操作。如果用户事先没有定义Combiner函数,就不用进行合并操作。如果用户事先定义了Combiner 函数,则这个时候会执行合并操作,从而减少需要溢写到磁盘的数据量。

使用Combiner后,可以将具有相同key<key, value>value加起来,这样可以减少键值对的数量从而减少数据传输量。

但是不是所有的都可以使用Combiner,因为Combiner的输出是Reduce程序的输入,Combiner决不能改变Reduce任务的最终计算结果。一般而言,累加、最大值等场景可以使用合并操作

11.MapReduce程序的输入文件、输出文件都存储在HDFS中,而在Map任务完成时的中间结果则存储在本地磁盘中。试分析中间结果存储在本地磁盘而不是HDFS上有何优缺点。

【答案1

因为Map的输出是中间的结果,这个中间结果是由reduce处理后才产生最终输出结果,而且一旦作业完成,map的输出结果就可以删除。如果把它存储在hdfs中就并备份,有些小题大作,如果运行map任务的节点将map中间结果传送给reduce任务之前失败,hadoop将在另一个节点上重新运行这个map任务以在此构建中间结果

【答案2

优点:更符合移动计算比移动数据经济原则,且Map输出结果仅仅是中间结果。

缺点:在Reduce任务完成后,中间结果会被删除, HDFS还会对该部分数据做复制备份,造成资源浪费。

12.早期的 HDFS,其默认块( Block)大小为 64 MB,而较新的版本默认为 128 MB,采用较大的块具有什么影响和优缺点?

采用较大的块说明分片的数量较小,那么map任务也较少,导致任务的并行化程度不高,不能充分利用集群资源,拖慢作业运行速度。

采用较小的块,说明map任务较多,而创建多个map任务进程需要耗费大量时间。

块的大小设置主要从以下考虑:减少磁盘寻道时间、减少Namenode内存消耗、Nap崩溃问题、监管时间问题、问题分解问题、约束Map输出。

13.试画出使用 MapReduce 来对英语句子“Whatever is worth doing is worth doing well”进行单词统计的过程。

书本140

假设执行单统计任务的 MapReduce 作业中,有 3个执行 Map 务的 Worker 1Reduce 任务的Worker。一个文档包含 3行内容,每行分配给一个Map 任务来处理。Map 操作输人是<key;value>形式其中key 是文档中某行的行号,value是该行的内容。Map 操作会将人文档中的每一个单词,以<key,value>的形式作为中间结果进行输出,如图7-7所示

然后,在Map端的Shufle过程中,如果用户没有定义 Combiner 函数,则Shufle过程会把具有相同 key的键值对归并成一个键值对,如图7-8所示。具体而言,若个具有相同 key 的镜值对<k1,v1>,<k1v2>, … <k1,vn>,会被归并成一个新的键值对<k1,<v1,v2,…,vn>>。比如在图 7-7 最上面的Map任务输出结果中存在 key 都是"World”的两个键值对<“World”>,经过Map端的Shumle过程以后,这两个键值对会被归并得到一个键值对<"World",1,1>>,这里不再给出 Reduce 端的Shufie结果。然后,这些归并后的键值对会作为 Reduce任务的输人,由 Reduce任务为每个单词计算出总的出现次数。最后,输出排序后的最终结果就会是:<"Bye",3><“Hadoop”,4><"Hello",3><"World",2>

在实际应用中,每个输人文件被 Map 函数解析后,都可能会生成大量类似<"the”1>这样的中间结果,很显然,这会大大增加网络传输开销。在前面介绍 Shufie过程时,我们曾经提到过,对于这种情形,MapReduce支持用户提供Combiner函数来对中间结果进行合并后再发送给Reduce任务,从而大大减少网络传输的数据量。对于图7-7中的Map 输出结果,如果存在用户自定义的Combiner 函数,则Reduce 过程示意如图7-9所示。

14.在基于MapReduce 的单词统计中,MapReduce 如何保证相同的单词数据会划分到同一个Reducer 上进行处理以保证结果的正确性?

通过将相同的单词数据作为key值,相同单词出现的次数作为value值,由于Reduce任务是按key 进行划分的,因此保证了相同的单词数据会划分到同一个Reducer上进行处理。

15.MapReduce 可用于对数据进行排序,一种想法是利用 MapReduce 的自动排序功能,即默认情况下,Reduce 任务的输出结果是有序的,如果只使用一个 Reducer 来对数据进行处理、输出则结果就是有序的了。但这样的排序过程无法充分利用 MapReduce 的分布式优点。试设计一个基于MapReduce 的排序算法,假设数据均位于[1,100]Reducer 数量为4,正序输出结果或逆序输出结果均可。试简要描述该算法( 可使用分区、合并过程 )

【答案1

如题,为了体现出MapReduce分布式的优点,采用了4reducer,数据位于[1,100]区间。对于reduce,它的输入本来就是有序的,但是针对多个reducer,我们需引入partitioner,数据流就成为 map->partitioner->reducer,分为多个partitioner,我们只需要保证多个partition有序即可。

首先输入数据在map的时候根据key的数值划分red_id,即4reducer需要拿到的数据,这样就先保证了partition有序,之后直接进行reduce,会输出4part4part结合就是最终的排序结果。

【答案2

Map过程中,将数据等量分给nMap过程进行快速排序,使用Combiner进行一定归并后输出;然后使用4Reducer分别处理区间为[1,25][25,50],[50,75],[75,100]的数据,最后归并成一个大文本数据。

16.试设计一个基于 MapReduce 的算法,求出数据集中的最大值。假设 Reducer 大于 1,试简要描述该算法(可使用分区、合并过程 )

【答案1

首先对输入数据要进行一定的处理,将代找的数据设置为key。如果reducer大于1,可以设置partitioner将数据分多个桶,最后只需要在多个job完成的part中找到最后一个元素(正序。最后一个即最大值)即可。

【答案2

Map过程中每一个任务通过PartitionCombine过程后只向Reducer传递自己这一部分的最大值,最后Reducer归并得到最大值即可。

18.当输入为由许多整数构成的文件,输出为最大整数时,试设计 MapReduce 算法实现上述功能,并写出Map 函数和 Reduce 函数。

  1. private static IntWritable data = new IntWritable();
  2. @Override
  3. public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
  4.     String line = value.toString();
  5.     data.set(Integer.parseInt(line));
  6.     context.write(data, new IntWritable(1));
  7. }
  8. private static IntWritable linenum = new IntWritable(1);
  9. @Override
  10. public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  11.     for (IntWritable val : values) {
  12.         context.write(linenum, key);
  13.         linenum = new IntWritable(linenum.get() + 1);
  14.     }
  15. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号