Hadoop面试问题和回答
[toc]
1:什么是Hadoop?
答:是google的核心算法MapReduce的一个开源实现。用于海量数据的并行处理。hadoop的核心主要包含:HDFS和MapReduce:
HDFS:是分布式文件系统,用于分布式存储海量数据。
MapReduce:是分布式数据处理模型,本质是并行处理。
2:用Hadoop来做什么的?
答:分布式的海量存储、大规模的日志分析、离线的数据处理,结合云计算,可以进行数据挖掘等
3:什么是MapReduce?
答:是一种分布式的处理数据的计算模型,采用分而治之的思想,把处理过程高度抽象为两个函数:map()函数和reduce函数,map函数将任务分解成多个任务,reduce负责把分解后的多个任务结果汇总起来。
详情
MapReduce借用了函数式编程的概念,是一种用分布式来处理数据的计算模型。
MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果。简单地说,MapReduce就是"任务的分解与结果的汇总"。
在分布式计算中,MapReduce框架负责处理了并行编程中分布式存储、工作调度、负载均衡、容错均衡、容错处理以及网络通信等复杂问题,把处理过程高度抽象为两个函数:map和reduce,map负责把任务分解成多个任务,reduce负责把分解后多任务处理的结果汇总起来。
4 Hadoop中,用于执行MapReduce任务的机器角色有两个?
一共有两个,分别是JobTracker和TaskTracker:
JobTracker:用于作业调度的,一个Hadoop集群中只有一个JobTracker,位于master
TaskTracker:用于作业执行,位于各slave上。
5 MapReduce提交作业的流程?
备注:要会画图
1 客户端编写好MapReduce程序,提交作业给JobTracker;
2 JobTracker构建job,分配作业ID;
3 检查作业的输出和输入目录,没有问题则对作业输入分片的进行计算;
4 配置资源,初始化作业,放入内部作业队列中;
5 初始化完毕后,作业调度器获取输入分片信息,创建对应map任务;
6 通过心跳机制获得可用的tasktracker,对其分配任务;
7 执行任务,同时jobtracker通过心跳机制进行监控,任务完成,则返回给jobtracker;
8 client去查询jobtracker,如果任务执行成功,则任务执行结束,否则再次提交作业。
详细提交作业流程看:
MapReduce工作机制
hadoop 学习笔记:mapreduce框架详解
6 MapReduce的计算过程?
分三部分:map shuffer reduce
要回画图
map
1)分片(split):FileInputFormat会将输入文件分割成多个split(等于block,*考点);
2)执行map:对分片的键值对进行map()运算,输出键值对到环形缓冲区中(考点);此处要进行partition
3)溢写spill:环形缓冲区达到阈值,启动溢写线程,将缓冲区的数据写入磁盘;
4)合并merge:溢写会产生多个文件,再写入磁盘前会进行排序(sort)和合并(combiner:对相同的key进行合并操作,提高带宽,考点)
备注:再进行合并时,会有partition操作,用来生成reduce的输入分片,对应于具体的reduce,类似于map阶段的输入分片,
shuffer
1)copy过程:Reduce端启动copy线程,通过Http方式,将map端输出的有序文件、属于自己的部分拉取到本地;
2)merge过程:copy数据先放在内存缓冲区,达到阈值时,溢写入磁盘,产生的多个小文件会合并成一个有序的最终文件,这个过程不断执行sort和combine。
reduce
1)将shuffer阶段最终生成的有序文件作为reduce的输入,对每个键值调用reduce()方法,并将结果写入HDFS中。
7 Hadoop分块和分片?
分块:
为了便于文件的管理和备份,HDFS使用块作为存储系统当中的最小单位,默认一个块的大小为64MB;
当有文件上传到HDFS上时,若文件大小大于设置的块太大,则该文件会被切分存储为多个块,多个块可以存放在不同的DataNode上,整个过程中 HDFS系统会保证一个块存储在一个datanode上 。
分片:
Hadoop会将MapReduce的输入数据划分为等长的小数据块,称为分片;
默认情况下,以HDFS的一个块的大小做为一个分片,即分片大小等于分块大小;
8 为什么默认分片大小与分块大小要相同呢?
太大,会导致map读取的数据可能跨越不同的节点,没有了数据本地化的优势
太小,会导致map数量过多,任务启动和切换开销太大,并行度过高
9 什么是map任务的数据本地化呢?
数据本地优化是指map任务中处理的数据存储在各个运行map本身的节点上,不需要跨界点消耗网络带宽进行数据传输,这能够使得作业以最好的状态运行。
10 环形缓冲区的机制?
Map过程中环形缓冲区是指:数据被map处理之后会先放入内存,内存中的这片区域就是环形缓冲区。
使用环形数据结构是为了有效使用内存空间,其数据结构是一个字节数组(KVBuffer:数据区域 索引数据区域)
具体的执行机制:
MapReduce源码解析--环形缓冲区
正确理解hadoop 2.x 的环形缓冲区: (一) MR环形缓冲区的结构
11 combine、partition和shuffer的区别?
combine:
把同一个key的键值对合并在一起,combine函数把一个map函数产生的<key,value>对(多个key,value)合并成一个新的<key2,value2>,将新的<key2,value2>作为输入到reduce函数中,这个value2亦可称之为values,因为有多个。这个合并的目的是为了减少网络传输。
partition:
partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的。这里其实可以理解归类。
partition的作用就是把这些数据归类,主要在Shuffle过程中按照Key值将中间结果分成R份,其中每份都有一个Reduce去负责,可以通过job.setPartitionerClass()方法进行设置,默认的使用hashPartitioner类。
Partitioner:对map()的输出进行partition,即根据key或value及reduce的数量来决定当前的这对键值对最终应该交由哪个reduce处理。默认是对key哈希后再以reduce task数量取模,默认的取模方式只是为了避免数据倾斜。然后该key/value对以及partitionIdx的结果都会被写入环形缓冲区。
shuffle:
shuffle就是map和reduce之间的过程,包含了两端的combine和partition。它比较难以理解,因为我们摸不着,看不到它,它只是理论存在的,而且确实存在,它属于mapreduce的框架。将map端的输入作为reduce的输出。
12 如何优化网络传输?
1)在分片时,调整分片大小和block块大小相同,不让分片跨界点存放,防止map时跨节点读取数据
2)在溢写时,对小文件进行合并,减少冗余文件,提高传输效率;其次使用combiner,将key相同的键值合并。
3)在shuffle的copy拉去数据时,需要网络传输,默认reduce端会并行从5个map端下载数据,可以调整这个并行默认参数。与此同时,加大下载等待时间,防止网络延迟过大或太慢,导致下载线程误判为失败。
4)使用压缩对数据进行传输。
13 Hadoop中为什么要使用数据压缩?
优点:
1,减少存储磁盘空间,降低单节点的磁盘IO。
2,加快网络传输的效率。
缺点:
需要花费额外的时间/CPU做压缩和解压缩计算
应用场景:
1,数据更多的是被存储,而不是被处理。例如使用HDFS作为数据存储,且上层搭建了Hive数据仓库。
2,数据本身有不错的压缩率。
参考:Hadoop数据压缩
14 Hadoop中的数据压缩有哪几种呢?
输入文件压缩:减少了I/O操作,但加大了cpu的处理时间;
压缩map程序中间输出:压缩这类输出可减少文件从map程序中写入到本地磁盘的文件I/O,也可以减少分区从Mapper节点传输到Reducer节点的网络I/O。;
压缩MapReduce程序的输出:对map和reduce的输出进行压缩;
压缩方式:
根据:压缩大小 压缩速度 是否可分割 冷热数据
Snappy压缩方式比GZIP方式快几个数量级,然而输出文件更大,大出20%-100%
Hadoop压缩方式
Boy-20180330-10:30 第一部分结束