Hadoop面试题汇总

本文深入探讨了Hadoop集群的配置和优化,包括常用端口号、HDFS和MapReduce的读写流程、Shuffle机制、Hadoop优化策略、压缩格式、YARN的Job提交流程、调度器对比以及NameNode的高可用。同时,文章提到了小文件问题、资源管理与故障处理,提供了实际的项目经验和参数调优建议,旨在提升Hadoop集群的效率和稳定性。
摘要由CSDN通过智能技术生成

1.Hadoop常用端口号

  • dfs.namenode.http-address:9870
  • dfs.datanode.http-address:9864
  • SecondaryNameNode辅助名称节点端口号:9868
  • dfs.datanode.address:9866
  • fs.defaultFS:9820
  • yarn.resourcemanager.webapp.address:8088
  • 历史服务器web访问端口:19888

2.Hadoop配置文件以及简单的Hadoop集群搭建

(1)配置文件:
core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
hadoop-env.sh、yarn-env.sh、mapred-env.sh、slaves
(2)简单的集群搭建过程:
JDK安装
配置SSH免密登录
配置hadoop核心文件:
格式化namenode

3.HDFS读流程和写流程

浅谈HDFS

4.MapReduce的Shuffle过程及Hadoop优化(包括:压缩、小文件、集群优化)

1、Shuffle机制(具体点击MapReduce工作流程

1)Map方法之后Reduce方法之前这段处理过程叫Shuffle
2)Map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区;环形缓冲区默认大小100m,环形缓冲区达到80%时,进行溢写;溢写前对数据进行排序,排序按照对key的索引进行字典顺序排序,排序的手段快排;溢写产生大量溢写文件,需要对溢写文件进行归并排序;对溢写的文件也可以进行Combiner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。
3)每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行排序。在进入Reduce方法前,可以对数据进行分组操作。

2、Hadoop优化

1)HDFS小文件影响

  • 影响NameNode的寿命,因为文件元数据存储在NameNode的内存中
  • 影响计算引擎的任务数量,比如每个小的文件都会生成一个Map任务

2)数据输入小文件处理:

  • 合并小文件:对小文件进行归档(Har)、自定义Inputformat将小文件存储成SequenceFile文件。
  • 采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景。
  • 对于大量小文件Job,可以开启JVM重用。

3)Map阶段

  • 增大环形缓冲区大小。由100m扩大到200m
  • 增大环形缓冲区溢写的比例。由80%扩大到90%
  • 减少对溢写文件的merge次数。(10个文件,一次20个merge)
  • 不影响实际业务的前提下,采用Combiner提前合并,减少 I/O。

4)Reduce阶段

  • 合理设置Map和Reduce数:两个都不能设置太少,也不能设置太多。太少,会导致Task等待,延长处理时间;太多,会导致 Map、Reduce任务间竞争资源,造成处理超时等错误。
  • 设置Map、Reduce共存:调整slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间。
  • 规避使用Reduce,因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。
  • 增加每个Reduce去Map中拿数据的并行数
  • 集群性能可以的前提下,增大Reduce端存储数据内存的大小。

5)IO传输

  • 采用数据压缩的方式,减少网络IO的的时间。安装Snappy和LZOP压缩编码器。
  • 使用SequenceFile二进制文件

6)整体

  • MapTask默认内存大小为1G,可以增加MapTask内存大小为4-5g
  • ReduceTask默认内存大小为1G,可以增加ReduceTask内存大小为4-5g
  • 可以增加MapTask的cpu核数,增加ReduceTask的CPU核数
  • 增加每个Container的CPU核数和内存大小
  • 调整每个Map Task和Reduce Task最大重试次数

3、压缩

压缩格式Hadoop自带?算法文件扩展名支持切分换成压缩格式后,原来的程序是否需要修改
DEFLATE是,直接使用DEFLATE.deflate和文本处理一样,不需要修改
Gzip是,直接使用DEFLATE.gz和文本处理一样,不需要修改
bzip2是,直接使用bzip2.bz2和文本处理一样,不需要修改
LZO否,需要安装LZO.lzo需要建索引,还需要指定输入格式
Snappy否,需要安装Snappy.snappy和文本处理一样,不需要修改

提示:如果面试过程问起,我们一般回答压缩方式为Snappy,特点速度快,缺点无法切分(可以回答在链式MR中,Reduce端输出使用bzip2压缩,以便后续的map任务对数据进行split)

4、切片机制

1)简单地按照文件的内容长度进行切片
2)切片大小,默认等于Block大小
3)切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
提示:切片大小公式:max(0,min(Long_max,blockSize))

5.Yarn的Job提交流程

浅谈Yarn

6.Yarn的默认调度器、调度器分类、以及他们之间的区别

1)Hadoop调度器重要分为三类:
FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。
Hadoop2.7.2默认的资源调度器是 容量调度器
2)区别:
FIFO调度器:先进先出,同一时间队列中只有一个任务在执行。
在这里插入图片描述
容量调度器:多队列;每个队列内部先进先出,同一时间队列中只有一个任务在执行。队列的并行度为队列的个数。
在这里插入图片描述
公平调度器:多队列;每个队列内部按照缺额大小分配资源启动任务,同一时间队列中有多个任务执行。队列的并行度大于等于队列的个数。

在这里插入图片描述
3)一定要强调生产环境中不是使用的FifoScheduler,面试的时侯会发现候选人大概了解这几种调度器的区别,但是问在生产环境用哪种,却说使用的FifoScheduler(企业生产环境一定不会用这个调度的)

7.项目经验之LZO压缩

Hadoop默认不支持LZO压缩,如果需要支持LZO压缩,需要添加jar包,并在hadoop的cores-site.xml文件中添加相关压缩配置。

8.Hadoop参数调优

1)在hdfs-site.xml文件中配置多目录,最好提前配置好,否则更改目录需要重新启动集群
2)NameNode有一个工作线程池,用来处理不同DataNode的并发心跳以及客户端并发的元数据操作。
dfs.namenode.handler.count=20 * log2(Cluster Size),比如集群规模为10台时,此参数设置为60
3)编辑日志存储路径dfs.namenode.edits.dir设置与镜像文件存储路径dfs.namenode.name.dir尽量分开,达到最低写入延迟
4)服务器节点上YARN可使用的物理内存总量,默认是8192(MB),注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。yarn.nodemanager.resource.memory-mb
5)单个任务可申请的最多物理内存量,默认是8192(MB)。yarn.scheduler.maximum-allocation-mb

9.项目经验之基准测试

搭建完Hadoop集群后需要对HDFS读写性能和MR计算能力测试。测试jar包在hadoop的share文件夹下。

10.Hadoop宕机

1)如果MR造成系统宕机。此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)
2)如果写入文件过量造成NameNode宕机。那么调高Kafka的存储大小,控制从Kafka到HDFS的写入速度。高峰期的时候用Kafka进行缓存,高峰期过去数据同步会自动跟上。

11.HDFS 默认的副本数?如果想修改副本数怎么修改

默认副本数为3,运行客户端的节点上放一个,第二个放与第一个不同且随机选择的机架上,第三个与第二个一个机架,另一个节点。

修改副本数的方法

在配置文件中修改 dfs.replication项,只能保证新写入的是2,原来的还是3
通过命令上传文件时,指定副本为1 : hadoop dfs -D dfs.replication=1 -put 文件 目标路径
修改已保存的文件的副本数: hadoop dfs -setrep 2 文件路径
对文件夹中的所有文件都修改副本数:hadoop dfs -setrep 2 -R 文件夹路径

12.MapReduce失败原因及应对

  1. 任务失败
    ① 代码中有bug:任务JVM在退出前向 ApplicationMaster 发错误报告,记日志,将此次任务尝试标记为失败,释放资源
    ② 任务JVM突然退出:NodeManager会发现进程退出,通知ApplicationMaster将此次任务尝试标记为失败
    ③ AM在一段时间内没收到进度更新,标记为失败,然后kill掉任务JVM
    注意:ApplicationMaster被告知一个任务失败后,会重新调度运行该任务,并避免在以前失败过的节点上再次运行,失败超过一定次数后,将不再重试

  2. Application Master失败
    进行重试,重试超过一定次数,将作业标记为失败
    运行中失败,AM向RM定期发送心跳,当AM失败时,RM检测到失败并在一个新的容器启动一个新的AM实例,使用作业历史来恢复应用程序所运行的任务的状态,使其不必重新运行
    作业初始化期间,客户端向RM询问并缓存AM的地址,向AM轮询进度报告,当轮询请求超时之后,客户端会重新向RM请求新的AM地址

  3. NodeManager失败
    如果NM崩溃或者运行十分缓慢,就会停止向RM发送心跳信息,10分钟内没收到心跳,RM将NM从自己的节点池中移除
    失败的NM上运行的任务或者AM将根据作业历史进行恢复,曾经在失败节点上运行的map任务,即使成功了也将重新运行,因为中间结果是存在失败节点的本地文件系统中的,无法被reducer访问

  4. ResourceManager失败
    运行一对RM,将运行中所有应用程序的信息存到一个高可用的状态区域中,主挂了,备份接替,备机读取状态区域中的应用程序信息后,为集群中运行的所有应用重启AM,快速恢复出主机的关键状态;主机到备机的切换由故障转移控制器处理

13.简述YARN中 ApplicationMaster 向 ResourceManager 申请资源的过程

Application Master启动后,会把自己的资源需求构造为一个ResourceRequest对象,通过心跳发送给ResourceManager ,向Resource Manager申请Container资源,RM根据当前节点的资源使用情况给Application Master分配资源,通过心跳应答将分配结果发送给Application Master,Application Master收到结果,与container所在节点通信,启动container。

14.join操作底层的MapReduce是怎么去执行的

连接在map端进行,称为map端连接,在reduce端进行,称为reduce端连接

map端连接

两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多 份,让每个map task内存中存在一份,然后只扫描大表:对于大表中的每一条记录key/value,查找小表中是否有,有的话就连接输出。

reduce端连接

map端把数据标记为KV形式,Value中表明数据的来源,(1,a_A)(1, a_B)(1, b_A),reduce端获取相同key下的所有value list (1, a_A , a_B , b_A),之后做笛卡尔积得到连接的结果
(1,AA)、(1,BA)

15.NameNode中的安全模式

nameNode启动时,首先将fsimage 文件载入内存 ,执行编辑日志中的各项操作,在内存中建立文件系统的元数据映像,然后创建一个新的fsimage文件,在这个过程中 ,namenode处于安全模式下,意味着namenode的文件系统对于客户端只读的。

在安全模式下,各个datanode向namenode发送最新的块列表信息,如果满足“最小副本条件”,namenode在30s内退出安全模式。

16.Yarn中ResourceManager的高可用当中“脑裂”问题的解决

什么是脑裂

多个节点都认为自己是唯一处于活动状态的服务器而争抢资源时,争启服务,产生脑裂,造成严重后果,造成两边服务都起不来,或者都起来了,但同时读写共享数据,造成数据损坏。

预防脑裂的几种方法

双机热备时,备机通过心跳检测主机的状态,当节点间的心跳线断开时,两个节点都认为是对方出了问题,可以采用多个心跳线。
采用磁盘锁,当心跳线断开时,正在服务的一方对磁盘进行加锁。
设施仲裁IP,当心跳线完全断开时,两个节点分别去ping一个IP地址,如果ping不通的话说明断点在本端,网络已经断开,就算启了服务也没用,所以放弃资源竞争。
可以尝试若干次连接旧manager,如果不成功再连接新manager。

17.NameNode中的高可用(HA)的实现

配置一对活动—备用NameNode,活动NameNode失败,备用NameNode就会接管任务开始服务,没有明显的中断。

NameNode之间通过高可用共享存储实现编辑日志的共享,备用接管后,读全部的编辑日志,实现与活动的状态同步,并继续读活动写入的新条目。

DataNode向两个NameNode发送数据块处理报告,因为数据块映射信息存储在内存中。

备用NameNode也做辅助NameNode的工作,定期进行检查点工作。

备用NameNode运行一个轻量级的故障转移控制器,通过心跳监视宿主NameNode是否失效,保证只有一个NameNode运行
详细点击:HDFS-HA故障转移机制

18.Yarn中 ResourceManager 的高可用实现(主备切换的底层实现)

手动切换

自动切换失效时,可以手动切换。步骤是:先把原来active的ResourceManager 切换为inactive,然后把一个standby的ResourceManager 切换为active,通过yarn rmadmin命令台实现。

自动切换

通过zookeeper可以实现RM的自动切换。

利用ZooKeeper实现NameNode主备切换的底层原理

HealthMonitor 初始化之后会启动内部的线程来定时调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法,对 NameNode 的健康状态进行检测。
HealthMonitor 如果检测到 NameNode 的健康状态发生变化,会回调 ZKFailoverController 注册的相应方法进行处理。
如果 ZKFailoverController 判断需要进行主备切换,会首先使用 ActiveStandbyElector 来进行自动的主备选举。
ActiveStandbyElector 与 Zookeeper 进行交互完成自动的主备选举。
ActiveStandbyElector 在主备选举完成后,会回调 ZKFailoverController 的相应方法来通知当前的 NameNode 成为主 NameNode 或备 NameNode。
ZKFailoverController 调用对应 NameNode 的 HAServiceProtocol RPC 接口的方法将 NameNode 转换为 Active 状态或 Standby 状态。

19.多任务同时请求资源怎么办?

进入RM中的调度队列等待

20.HDFS小文件过多会怎么样

小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能
HDFS中,小文件过多会占用大量内存,NameNode内存容量严重制约了集群的扩展
HDFS读写小文件更加耗时,每次都需要从 NN 获取元信息,并与对应的DataNode建立连接
小文件是如何产生的

动态分区插入数据,产生大量的小文件
参数设置的 reduce 数量太多
数据源本身就包含大量的小文件
小文件的解决方案

设置合并参数;
少使用textfile;
少用动态分区;
设置reduce数量
对于已有的小文件的解决方案

Hadoop archive命令进行归档;
重跑数据,指定map reduce参数,指定存储格式(ORC)

21.通过机架感知如何确立3个副本的存储?

第一个副本存储在本机
第二个副本存储在网络拓扑最近的机架
第三个副本存储在第二个副本所在机架上的随机一个节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值