上两篇文章传送门:
继上一篇Spark相关的面试问题,本篇总结一下Hadoop相关的面试问题,由于Hadoop相关的问题大多涉及到原理及运行流程,内容较多较复杂,因此建议精读《Hadoop权威指南》以及各位大佬的blog~
- 1、HDFS 默认的副本数?如果想修改副本数怎么修改
- 2、HDFS 的文件结构
- 3、租约管理(Lease机制)
- 4、第一关系管理及第二关系管理
- 5、NameNode中的集中式缓存管理
- 6、零拷贝模式
- 7、HDFS读取、写入过程
- 8、checkpoint流程
- 9、HDFS的各节点之间如何通信
- 10、MapReduce作业提交后的执行过程
- 11、MapReduce1工作机制、比较MapReduce1和YARN(MapReduce2)
- 12、MapReduce失败原因及应对
- 13、Yarn 中的调度器
- 14、简述YARN中 ApplicationMaster 向 ResourceManager 申请资源的过程
- 15、MapReduce中的shuffle
- 16、join操作底层的MapReduce是怎么去执行的
- 17、MapReduce中的Counter
- 18、NameNode中的安全模式
- 19、MapReduce中的排序
- 20、NameNode中的高可用(HA)的实现
- 21、Yarn中 ResourceManager 的高可用实现(主备切换的底层实现)
- 22、Yarn中ResourceManager的高可用当中“脑裂”问题的解决
)
1、HDFS 默认的副本数?如果想修改副本数怎么修改
默认副本数为3,运行客户端的节点上放一个,第二个放与第一个不同且随机选择的机架上,第三个与第二个一个机架,另一个节点。
修改副本数的方法
- 在配置文件中修改 dfs.replication项,只能保证新写入的是2,原来的还是3
- 通过命令上传文件时,指定副本为1 : hadoop dfs -D dfs.replication=1 -put 文件 目标路径
- 修改已保存的文件的副本数: hadoop dfs -setrep 2 文件路径
- 对文件夹中的所有文件都修改副本数:hadoop dfs -setrep 2 -R 文件夹路径
2、HDFS 的文件结构
namenode文件结构
- edits:编辑日志
- fsimage:文件系统镜像,文件系统元数据的持久检查点
- seen_txid:存放 edits*文件的最后一个数,namenode重启时,会从edits_0001一直跑到edits_000(seen_txid)
- version:包含正在运行的hdfs版本信息
- in_use.lock:锁文件,namenode使用该文件时为存储目录加锁,防止多个namenode实例同时使用损坏数据。
datanode文件结构
- blk_文件:数据块文件
- BP文件:代表数据块池
- finalized/rbw文件:存储块数据,包含 .meta 文件,包括校验和等信息
- version文件:版本信息
- in_use.lock:锁文件
3、租约管理(Lease机制)
HDFS支持一次写入多次读取,对文件写操作的互斥同步靠Lease实现。Lease实际上是时间约束锁,主要特点是排他性。客户端写文件时需要先申请一个Lease,一旦有客户端持有了某个文件的Lease,其它客户端就不可能再申请到该文件的Lease,这就保证了同一时刻对一个文件的写操作只能发生在一个客户端。NameNode的LeaseManager是Lease机制的核心,维护了文件与Lease、客户端与Lease的对应关系。
LeaseManager包括以下三个主要核心数据结构
- sortedLeases:Lease集合,按照时间先后有序组织,便于检查Lease是否超时 ;
- leases:客户端到Lease的映射关系 ;
- sortedLeasesByPath:文件路径到Lease的映射关系;
LeaseManager.Monitor 的作用
由于Lease本身的时间约束特性,当Lease发生超时后需要强制回收,内存中与该Lease相关的内容要被及时清除。超时检查及超时后的处理逻辑由LeaseManager.Monitor执行。
软超时(softLimit)和硬超时(hardLimit)
正常情况下,客户端向集群写文件前需要向NameNode的LeaseManager申请Lease;写文件过程中定期更新Lease时间,以防Lease过期,写完数据后申请释放Lease。整个过程可能发生两类问题:
(1)写文件过程中客户端没有及时更新Lease时间 —— softLimit
(2)写完文件后没有成功释放Lease —— hardLimit
租约恢复
软硬超时之后的强制回收称为租约恢复。两种场景都会触发LeaseManager对Lease超时强制回收。如果客户端写文件过程中没有及时更新Lease超过softLimit时间后,另一客户端尝试对同一文件进行写操作时触发Lease软超时强制回收;如果客户端写文件完成但是没有成功释放Lease,则会由LeaseManager的后台线程Monitor检查是否硬超时后统一触发超时回收。
软硬超时的回收逻辑都一样,先对Lease过期前最后一次写入的Block进行检查和修复,之后释放超时持有的Lease,保证后面其它客户端的写入能够正常申请到该文件的Lease。
4、第一关系管理及第二关系管理
- 第一关系:文件与数据块的关系,由 fsimage 和 编辑日志 提供
- 第二关系:数据块与节点的映射关系,NameNode启动时,DataNode会上报其所有的块信息,这些信息构成了第二关系,INodeFile.blocks字段记录了一个HDFS文件拥有的所有数据块,通过这个字段HDFS第一关系与第二关系发生了关联。
5、NameNode中的集中式缓存管理
允许用户将指定路径的文件或目录进行缓存,NameNode会通知拥有对应块的DataNodes将其缓存在DataNode的内存当中。使用集中式缓存主要出于以下原因:
- 防止那些被频繁使用的数据从内存中清除;
- 因为DataNode的缓存由NameNode来管理(并作为元数据的一部分进行持久化),applications在做任务安排时可以查询这个缓存的列表,使用一个被缓存的块副本能够提高读性能;
- 减少cache浪费。例如一个block的三个replica分别存储在三个DataNote 上,有可能这个block同时被这三台DataNode的OS buffer cache,但是这个情况并没有对外暴露,从HDFS的全局看就有同一个block在cache中存了三份,其实可能只需要一份;
- 加快HDFS client读速度。过去NameNode处理读请求时只根据拓扑远近决定去哪个DataNode读,现在当HDFS client和要读取的block被cache在同一台DataNode的时候,可以通过zero-copy read直接从内存读,略过磁盘I/O、checksum校验等环节。
6、零拷贝模式
DataNode读取数据块的正常过程为:
- Datanode会首先将数据块从磁盘存储读入操作系统的内核缓冲区。(外设和内存之间)
- 再将数据跨内核推到用户缓冲区(内存中)
- 然后会再次跨内核将数据推回内核中的套接字缓冲区(内存中)
- 最后将数据写入网卡缓冲区(外设和内存之间)
造成四次上下文切换,使用零拷

这篇博客总结了大数据岗位校招中关于Hadoop的面试要点,涵盖了HDFS的副本数修改、文件结构、租约管理、NameNode的集中式缓存管理和零拷贝模式,以及MapReduce的作业提交流程、MapReduce1与YARN的比较和调度器机制。此外,还讨论了NameNode的安全模式和高可用实现,以及YARN中ResourceManager的高可用和脑裂问题的解决。
最低0.47元/天 解锁文章
759

被折叠的 条评论
为什么被折叠?



