前言:
很多小伙伴让我分享一其关于Hadoop的面试题,今天他来了,首先我在这里说明一下,以下分享的面试题全部都是我自己经历过,经过在海量的面试题中总结了15到非常高频的题目分享给大家。大数据老哥在这里祝你们找到自己心仪的工作,废话不多说我们就开始吧,制作不易:【一键三连】。
一、 你说你深刻理解MR的工作流程,你给我讲一下吧
首先当面试问你这个问题的时候就到了你展示自己的时候了,不要再说一两句话了,如通过1.inputFrom读取数据,2.使用split切分数据。通过rr进行切分等等。以下是我回答的。
- 在客户端执行submit()方法之前,会先去获取一下待读取文件的信息
- 将job提交给yarn,这时候会带着三个信息过去(job.split(文件的切片信息),jar.job.xml)
- yarn会根据文件的切片信息去计算将要启动的maptask的数量,然后去启动maptask
- maptask会调用InPutFormat()方法区HDFS上面读取文件,InPutFormat()方法会再去 调用RecordRead()方法,将数据以行首字母的偏移量为key,一行数据为value传给 mapper()方法
- mapper方法做一些逻辑处理后,将数据传到分区方法中,对数据进行一个分区标注后,发 送到环形缓冲区中
- 环形缓冲区默认的大小是100M,达到80%的阈值将会溢写 7.在溢写之前会做一个排序的动作,排序的规则是按照key进行字典序排序,排序的手段是 快排
- 溢写会产生出大量的溢写文件,会再次调用merge()方法,使用归并排序,默认10个溢写 文件合并成一个大文件,
- 也可以对溢写文件做一次localReduce也就是combiner的操作,但前提是combiner的 结果不能对最终的结果有影响
- 等待所有的maptask结束之后,会启动一定数量的reducetask
- reducetask会发取拉取线程到map端拉取数据,拉取到的数据会先加载到内存中,内存 不够会写到磁盘里,等待所有的数据拉取完毕,会将这些输出在进行一次归并排序
- 归并后的文件会再次进行一次分组的操作,然后将数据以组为单位发送到reduce()方 法reduce方法做一些逻辑判断后,最终调用OutputFormat()方法,Outputformat()会再 去调用RecordWrite()方法将数据以KV的形式写出到HDFS上
二、HDFS分布式存储工作机制
HDFS是一个文件存存储系统,他的meta信息以及目录结构是存储在NameNode中的,文 件是以block的形式存储在DataNode中,通过与NameNode交互,可以实现读写的操作
写入请求
- 客户端会带着文件路径向NameNode发送写入请求通过 RPC 与 NameNode 建立通讯, NameNode 检查目标文件,返回是否可以上传;
- Client 请求第一个 block 该传输到哪些 DataNode 服务器上
- NameNode 根据副本数量和副本放置策略进行节点分配,返回 DataNode节点,如:A,B,C
- Client 请求A节点建立pipeline管道,A收到请求会继续调用B,然后B 调用C,将整个pipeline管道建立完成后,逐级返回消息到Client;
- Client收到A返回的消息之后开始往A上传第一个block块,block块被 切分成64K的packet包不断的在pepiline管道里传递,从A到B,B到C进行 复制存储
- 当一个 block块 传输完成之后,Client 再次请求 NameNode 上传第二 个block块的存储节点,不断往复存储
- 当所有block块传输完成之后,Client调用FSDataOutputSteam的 close方法关闭输出流,最后调用FileSystem的complete方法告知 NameNode数据写入成功
读取请求
- 客户端会先带着读取路径向NameNode发送读取请求,通过 RPC 与 NameNode 建立通讯,NameNode检查目标文件,来确定请求文件 block 块的位置信息
- 客户端会先带着读取路径向NameNode发送读取请求,通过 RPC 与 NameNode 建立通讯,NameNode检查目标文件,来确定请求文件 block 块的位置信息
- 这些返回的 DataNode 地址,会按照集群拓扑结构得出 DataNode 与 客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
- Client 选取排序靠前的 DataNode 调用FSDataInputSteam的read方 法来读取 block块数据,如果客户端本身就是DataNode,那么将从本地直 接获取block块数据
- 当读完一批的 block块后,若文件读取还没有结束,客户端会继续向 NameNode 获取下一批的 block 列表,继续读取
- 所有block块读取完成后,Client调用FSDataInputStream.close()方 法,关闭输入流,并将读取来所有的 block块合并成一个完整的最终文件
三、YARN的资源调度工作机制
- 客户端向ResourceManager提交应用程序,其中包括启动该应用的 ApplicationMaster的必须信息,例如ApplicationMaster程序、启动 ApplicationMaster的命令、用户程序等。
- ResourceManager启动一个container用于运行ApplicationMaster
- 启动中的ApplicationMaster向ResourceManager注册自己,启动成功后与 ResourceManager保持心跳。
- ApplicationMaster向ResourceManager发送请求,申请相应数目的 container。
- 申请成功的container,由ApplicationMaster进行初始化。container 的启动信息初始化后,ApplicationMaster与对应的NodeManager通信, 要求NodeManager启动container。
- NodeManager启动container。
- container运行期间,ApplicationMaster对container进行监控。 container通过RPC协议向对应的ApplicationMaster汇报自己的进度和状态 等信息。
- 应用运行结束后。
yarn资源调度流程图
四、yarn默认的调度器分是什么,及他们区别
yarn调度器分为一下三种:
- FIFO :先进先出,同一个队列中现先提交的先执行,后面等待
- Capacity Scheduler(容量调度器): 允许创建多个任务队列,每个队列使用所有资源的一部分。多个任务队列可 以同时执行。但是一个队列内部还是先进先出。
- Fair Scheduler(公平调度): 第一个程序在启动时可以占用其他队列资源(100%占用),当其他队列有 任务提交是,占用资源的队列需要将资源还给该任务。还资源的时候,效率 比较慢。
五、 HadoopHA的架构原理
首先我们在回答这个问题的时候从HA的设计和当宕机了怎么操作的这两方面进行回答,一下是我的回答,仅供参考
- HadoopHa中包括了两分NameNodeHA和resourceMangerHA
- HadoopHa解决了早期版本的NameNode单点问题。yarnHa解决了 resourceManagr的单点问题
- NameNodeHa方案中包含两个NameNode一个action状态,一个是 standby状态。每个NameNode分配在两个完全独立的服务器中,每个 NamNode所在节点需配置要给ZKFC
- 两个NameNode之前的元数据信息是通过jn传递的
宕机转移
- 当actionNameNode节点发生故障ActionZKF通过zookeeper删除临时的 zNode
- StandBy状态下的ZKF订阅了这个临时的zNode的变换,若zNode消失, StandBy状态的ZKFC立刻通过standby NameNode
- StandByNameNode远程登录actionNameNode执行kill-9 actionNameNode
- StandByNameNode通知StandByZkfc去zookeeper上注册zNode,注册成功转换 为action转态。
六、Hadoop解决数据倾斜方法
在面试的时候很多面试管斗都喜欢问 数据倾斜了怎么办,什么原因造成的数据倾斜等,一下是我回答的,仅供参考。
-
提前在map进行combine,减少传输的数据量
- 在Mapper加上combine相当于提前reduce,既吧一个mapper中的相同key进行 了聚合,减少shuffle过程中传输的数据量,以及Reducer端的计算量
- 如果导致数据倾斜的key 大量分布在不同的mapper的时候,这种方法就不 是很有效了。
-
导致数据倾斜的key 大量分布在不同的mapper
1)局部聚合加全局聚合。
- 第一次在map阶段对那些导致了数据倾斜的key 加上1到n的随机前缀,这 样本来相同的key 也会被分到多个Reducer中进行局部聚合,数量就会大大 降低。
- 第二次mapreduce,去掉key的随机前缀,进行全局聚合。
2)增加Reducer,提升并行度
- JobConf.setNumReduceTasks(int)
- 实现自定义分区
3)根据数据分布情况,自定义散列函数,将key均匀分配到不同Reducer
七、HDFS小文件怎么处理的
- 小文件的危害
- 每个文件在NameNode中存储大约占150个字节
- 小文件过多会影响namenode的寿命
- 影响MR的执行任务的数量,因为MR会对一个小文件开启一个Maptask,maptask任务过多则会导致频繁的开启关闭,降低了执行效率
- 在Flume阶段配置参数解决这个问题
- 通过参数来控制
- 先生成临时文件,达到128M或者是1个小时滚成一个新的文件
- 使用Hadoop自带的HAR
- 将多个小文件打包成一个正式文件,NameNode中的元数据也就存储一份
- CombineFileInputFormat
- MR读取数据时将对个小文件当做一个文件,只起一个MapTask,提高了任务的执行效率
八、Hadoo配置文件以及简单的Hadoop集群搭建
这个道题目基本上会出现在笔试题上。博主亲自经历过,虽然很简单但是往往大多数人因为简单而丢分。
- 安装Jdk
- 配置ssh免密登录
- 配置Hadoop的核心文件
- core-site.xml
- hdfs-site.xml
- mapred-site.xml
- yarn-site.xml
- yarn-env.sh
- hadoop-env.sh
- mapred-env.sh
- slave
- 格式化NameNode
- 启动
九、Hadoop中combiner和partition作用
- combiner是发生在map的最后一个阶段,父类就是reduce,意识就是对一个maptask的输出进行局部汇总,以减少网络传输量,缓解网络传输瓶颈,提高reduce的执行效率。
- partition的主要作用将map的最后一个阶段所有kv对分配给不同的reduce task处理,可以将reduce阶段的处负载进行分摊。
10、Hadoop优化
十一、Fsimage和edit的区别,集作用是什么?
- 客户端修改文件时候,先更新内存中的 metadata信息,只有当对文件操作成功的
时候,才会写到 editor - fsimage是文件meta信息的持久化的检查点。 secondary namenode会定期的将
fsimage和 editlog合并dump成新的 fsimage
作用:
fsimage存储的是系统最近一次关机前的集群镜像,
edits是客户端对HDFS文件系统的所有操作日志 恢复集群到上次关机前的状态
十二、MapReduce为什么分两部分,为什么不直接map或直接reduce
- 是为了实现分布式计算,提高计算效率。
- 很多情况下都是需要对整个数据集进行计算操作,单单的分成每个单独的小部分虽然能提高计算效率,但是导致无法完成实际需求,是没有任何意义的,
- 所以添加一个reduce阶段,负责将分成多个部分计算的结果汇总进行处理,使得更加能满足一般需求。
十三、Hadoop会有哪些重大故障,如何应对?至少给出 5个。
- namenode 单点故障:通过 zookeeper 搭建 HA 高可用,可自动切换 namenode。
- ResourceManager单点故障:可通过配置YARN的HA,并在配置的namenode上手动启动ResourceManager作为Slave,在 Master 故障后,Slave 会自动切换为Master。
- Rduce阶段内存溢出:是由于单个reduce任务处理的数据量过多,通过增大reducetasks数目、优化partition 规则使数据分布均匀进行解决。
- Datanode内存溢出:是由于创建的线程过多,通过调整linux的maxuserprocesses参数,增大可用线程数进行解决。
- 集群间时间不同步导致运行异常:通过配置内网时间同步服务器进行解决。
十四、你认为 hadoop 有哪些设计不合理的地方。
- 不支持文件的并发写入和对文件内容的随机修改。
- 不支持低延迟、高吞吐的数据访问。
- 存取大量小文件,会占用 namenode 大量内存,小文件的寻道时间超过读取时间。
- Hadoop 环境搭建比较复杂。
- 数据无法实时处理。
- MapReduce 的 shuffle 阶段 IO 太多。
- 编写 MapReduce难度较高,实现复杂逻辑时,代码量太大。
十五、yarn的三个核心组件
- ResourceManage 负责整个集群资源的分配
- NodeManage 每个节点上的资源管理器
- ApplicationMaster 单个应用程序的管理者
总结:
以上就是本期分享的内容了,虽然内容多,你也坚持看到这里了,Hadoop那么多的内容就这15个题目就可以了吗? 往往不是的,只有准备的充分了才有底气跟面试官聊,我还为大家准备了一个超级详细的脑图,微信搜索公众号【大数据老哥】回复:Hadoop面试题即可获取。 我们下期见~~~~