Hadoop面试题

文章详细描述了HDFS的写数据和读数据流程,包括datanode错误的处理方式,以及元数据的fsimage和edits文件存储。此外,还介绍了HDFS针对小文件的解决方案,如HadoopArchive和CombineFileInputFormat。最后,概述了YARN的工作机制,包括ApplicationMaster的角色和任务调度过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.HDFS写数据流程

在这里插入图片描述
1) 客户端本地通过RPC与namenode建立rpc通信,然后请求上传文件。

2) namenode收到请求后,会检査是否能创建该文件(比如校验用户是否有该权限,文件是否已经存在等)。如果检查通过,namenode就会开始记录该新文件的元信息(先写入edits文件,然后更新内存中的metadata),并响应client可以开始上传。

3) client 在本地将文件进行切块(按照指定的block大小)。然后请求namemode上传第一个block。

4) namenode根据策略以及每个datanode的情况,返回3个datanode(dn1、dn2、dn3)地址给client(这里默认3副本)。

5) client与请求namenode返回的3个datanode建立pipeline,即 client请求dn1,dn1请求dn2,dn2请求dn3,这样一个串行的输出传输通道。

6) 3个datanode逐级响应(dn3->dn2->dn1),表示可以传输数据,最终响应给client。

7) client会将每个block还会分割成一个个packet,然后放入 data queue中,等待上传。每传输一个packet,就会将packet加入到另外一个 ack queue中,等到pipeline中的datanode响应传输完成后,就会将相应的packet从ack queue中移除。
8) 后面就是重复上面的流程,直到client关闭通道,并将所有的queue中的packet刷写到pipeline中之后,datanode就会标记文件已完成。

1.1 datanode发生错误的解决方式

问题:传输过程中,某个datanode发生错误,hdfs是怎么解决?

1)将数据传输的pipeline关闭
2)为了防止丢包,ack queue中的packet会同步到data queue中,重新进行下一次传输。
3)把产生错误的datanode上当前在写,但未完成的block删除掉。
4)剩下的block写到剩余两个正常的datanode中。
5)namenode会自动寻找另外合适的一个datanode复制另外两个datanode中刷写的block,完成3副本的写入。当然,这个操作是namenode的内部机制,对client来说是无感知的。

1.2 元数据的存储

namenode使用两种文件保存元数据,fsimage 和 edits 文件。
fsimage:元数据镜像文件,存储某一时间段内的namenode的内存元数据信息
edits:操作日志文件。
fstime:保存最近一次checkpoint的时间。

2.HDFS读数据流程

在这里插入图片描述
1)客户端向namenode请求下载文件,namenode在内存的metadata查找对应的文件的元数据,如果无则返回无,有则返回对应文件的block位置信息。且namenode会根据客户端所在的位置,根据datanode以及client之间的距离远近,将返回的 block 的副本的datanode节点从距离小到大排序,距离最近的datanode则排在第一位。
2)client通过机架感知策略,选择最近的datanode进行block请求读取。
3)datanode开始传输数据给client,以packet为单位,并做数据校验。
4)客户端接收packet之后,本地缓存,然后再往本地路径写入该block。
5)第二块,第三块block重复以上过程。
6)当客户端读取完所有数据块的数据后,调用 FSDataInputStream 的 Close() 方法。

3.HDFS小文件解决方案

  • Hadoop Archive
    • 一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样就减少了NameNode的内存使用。
  • Sequence File
    • Sequence File由一系列的二进制key/value组成,如果key为文件名,value为文件内容,则可以将大批小文件合并成一个大文件。
  • CombineFilelnputFormat
    • CombineFileInputFormat是一种新的InputFormat,用于将多个文件合并成一个单独的Split,另外,它会考虑数据的存储位置。
  • 开启JVM重用
    • 对于大量小文件Job,可以开启JVM重用会减少45%运行时间。
    • JVM重用原理:一个Map运行在一个JVM上,开启重用的话,该Map在JVM上运行完毕后,JVM继续运行其他Map。具体设置: mapreduce.job.jvmnumtasks值在10-20之间

4.Yarn工作机制

当用户向 YARN 中提交一个应用程序后,YARN 将分两个阶段运行该应用程序 :第一个阶段是启动 ApplicationMaster ;第二个阶段是由 ApplicationMaster 创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。

在这里插入图片描述

步骤:

  • 1.用户 YARN中提交应用程序, 其中包括MRAppMaster程序、 启动 MRAppMaster 的命令、用户程序等。(MRAppMstr 程序在客户端生成,这一步已经将应用程序先行程序提交到RM的Application Manager模块进行处理,将运行程序所需的jar包、环境变量、切片信息等提交到HDFS之上,需要等MRAPPMstr返回一个可用的Container的时候在节点提交执行。可以理解为惰性处理,减少资源占用,做到需要什么提交什么)
  • 2.ResourceManager 为该应用程序分配第一个 Container,并与对应的 Node-Manager 通信,要求它在这个 Container 中启动应用程序的MRAppMaster。(APPMaster就是先头兵,这时的操作是RM的ApplicationManager来进行处理)
  • 3.MRAppMaster 首先向 ResourceManager 注册, 这样用户可以直接通过ResourceManager 查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到整个应用运行结束。
  • 4.MRAppMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和领取资源。
  • 5.一旦 MRAppMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务。(理解集群中不同节点的资源动态变动,可用Container以及不同的Task可以在不同的节点运行)
  • 6.NodeManager 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序 等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。(此时,客户端才真正上传具体Task需要的Jar包等等运行资源,同时NodeManager通过调用资源运行对应的Task任务);
  • 7.各个任务通过某个RPC 协议向MRAppMaster 汇报自己的状态和进度,以让 MRApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。 在应用程序运行过程中,用户可随时通过 RPC 向 MRAppMaster 查询应用程序的当 前运行状态。
  • 步骤4~7是重复执行的
  • 8.应用程序运行完成后,MRAppMaster 向 ResourceManager 注销并关闭自己。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值