Hadoop面试问题和回答2
[toc]
参考:彻底了解mapreduce核心Shuffle--解惑各种mapreduce问题
1 shuffle 是什么? 怎么调优?
shuffle将map的输出作为reduce端的输入,包括map端的combine和partition,以及reduce端的copy和combine;
其目的就是:完整地从map task端拉取数据到reduce 端;在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗,减少磁盘IO对task执行的影响。
调优:
减少I/O操作和提高网络传输效率
2 每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据该如何处理?
每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候,需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后再对磁盘中这个map task产生的所有临时文件进行合并,生成最终的正式输出文件,然后等待reduce task来拉数据。
3 MapReduce提供Partitioner接口,它的作用是什么?
根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce处理。默认对key hash后再以reduce数量取模。默认的取模方式只是为了平均reduce的处理能力,防止数据倾斜;如果用户自己对Partitioner有需求,可以订制并设置到job上。
4 溢写是为什么不影响往缓冲区写map结果的线程?
关键词:阈值 启动 锁定 执行
溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。
5 当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对谁的排序?
关键字:序列化字节
当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。
6 溢写过程中如果有很多个key/value对需要发送到某个reduce端去,那么如何处理这些key/value值?
关键字:拼接 减少索引
如果有很多个key/value对需要发送到某个reduce端去,那么需要将这些key/value值拼接到一块,减少与partition相关的索引记录。
7 哪些场景才能使用Combiner呢?
关键字:类型一致 不影响 累加 最大值
Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。
8 Merge的作用是什么?
关键字:归并 溢写文件 过程
最终磁盘中会至少有一个这样的溢写文件存在(如果map的输出结果很少,当map执行完成时,只会产生一个溢写文件),因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫做Merge
9 每个reduce task不断的通过什么协议从JobTracker那里获取map task是否完成的信息?
关键字:RPC
每个reduce任务不断地通过RPC从JobTracker那里获取map任务是否完成的信息。
10 reduce中Copy过程采用是什么协议?
关键字:拉取 fetcher http
Copy过程,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求map任务所在的TaskTracker获取map任务的输出文件。
11 reduce中merge过程有几种方式?
关键字:阈值 溢写 merge 结束
merge有三种形式:
- 内存到内存
- 内存到磁盘
- 磁盘到磁盘。
默认情况下第一种形式不启用,让人比较困惑,是吧。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的那个文件。
12 Combiner 过程是 属于map阶段还是属于reduce阶段?
关键字:聚合 排序 迭代 一个map 多个map
combiner最基本是实现本地key的聚合,对map输出的key排序,value进行迭代。
combiner的目的是减少map网络流量。
combiner的对象是对于map
combiner具有和reduce相似的功能,是一个Reducer的实现类。只不过combiner合并对象,是对于一个map。reduce合并对象,是对于多个map。
13 map和reduce的数量怎么设定?
map的数量:
通常是由hadoop集群的DFS块大小确定的,也就是输入文件的总块数,正常的map数量的并行规模大致是每一个Node是10~100个。通过conf.setNumMapTasks(int num)
设置;
reduce的数量:
正确的reduce任务的个数应该是0.95或者1.75 *(节点数 ×mapred.tasktracker.tasks.maximum参数值)。如果任务数是节点个数的0.95倍,那么所有的reduce任务能够在 map任务的输出传输结束后同时开始运行。如果任务数是节点个数的1.75倍,那么高速的节点会在完成他们第一批reduce任务计算之后开始计算第二批 reduce任务,这样的情况更有利于负载均衡。通过conf.setNumReduceTasks(int num)
设置。
Boy-20180330-15:20