HDFS问答

一、描述一下HDFS的数据写入流程

(1)客户端通过DFS问NN能不能上传文件,NN对文件进行一系列校验,校验通过就告诉客户端可以上传,校验不通过就报错

(2)NN响应之后,如果可以上传文件,此时客户端已经对文件进行了切块操作

(3)客户端问NN第一个数据块(Block)能不能开始上传,上传到哪儿(DN名单)

(4)NN根据机架感知策略给出DN名单dn1、dn2、dn3,表示客户端可以将数据块传到这些节点上

(5)客户端通过数据输出流(FSDataOutputStream)发出请求上传数据,DN根据网络拓扑原理确定先从dn1开始建立通道,然后dn1调用dn2,dn2调用dn3,把整个通道建立完成。

(6)dn1、dn2、dn3逐级应答客户端。

(7)客户端开始往dn1上传第一个数据块(先从客户端读取数据放到DN本地内存缓存),这时数据块以更小的数据包(Packet 64k)为单位开始传给dn1,dn1收到一个数据包就会传给dn2,dn2传给dn3;dn1每传一个数据包就会放入一个ack应答队列等待应答,应答通过,才开始写数据,应答不通过,等队列通畅再重新写,直到所有数据包上传完毕

(8)当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。

为什么客户端采用串行方式建立通道?

​ 此方式客户端单个数据块只需要上传一次,会降低客户端的IO开销,减小客户端的运行压力

二、描述一下HDFS的数据读取流程

(1)客户端通过DFS问NN能不能下载文件,NN查询元数据找到文件的数据块所在的DN地址。

(2)挑选一台DN(先就近,后随机)请求读取数据。

(3)DN开始传数据包(Packet)给客户端。

(4)客户端接收数据包,先在本地缓存,然后写入目标位置的目标文件。

三、简述HDFS的架构,其中每个服务的作用

NameNode

​ hdfs的中心服务,存储DN中的元数据信息,处理客户端请求

​ NN和DN之间通信:每隔3s检测一次心跳,检测DN是否挂掉。

DataNode

​ 实际放数据块的地方

SecondaryNameNode

​ 2NN主要是用来合并NN中的编辑日志和元数据文件,并且合并一次,自己也会保存一份元数据文件。

Client

​ 把文件切成数据块(Block),通过NN获取文件地址,通过DN读写数据,用命令管理(NN格式化)、访问HDFS(CRUD操作)

四、HDFS中如何实现元数据的维护?

​ 采用内存+磁盘都存的策略

​ 所有对文件的操作记录经过把关后都追加到编辑日志末尾

​ 满足一定条件下,将本地元数据文件和编辑日志读取到内存中合成最新的元数据镜像,然后把最新的元数据镜像从内存中再推到本地

五、2NN如何对NN的元数据进行合并

​ hdfs集群启动时,NN自己把元数据镜像和编辑日志合并一次。

​ 满足一定条件时,2NN每隔一个小时对NN的编辑日志和元数据镜像合并一次。

​ 合并的时候先告诉NN一声,这时候NN就把手上的活(追加编辑日志)停下,同时NN创建一个新的编辑日志文件,保证自己的正常工作。

​ 2NN把NN本地的元数据镜像和编辑日志拉取到2NN本地,在内存里边合并成一个新的元数据镜像,2NN自己备份一份,发给NN本地一份。

​ 另外,由于2NN每隔60s检测一次NN的编辑日志操作次数,如果NN的编辑日志累计操作次数超过一百万次,这时候即使时间没够1小时,2NN也会合并。

六、描述一下NN和DN的关系,以及DN的工作流程

​ NN跟DN是一对多的关系,一个NN管理多个DN的数据块的元数据信息

​ hdfs集群启动时,先进入安全模式,此时的数据只能读不能写

​ 每一台DN都要找NN注册,注册成功后跟NN汇报自己的数据块信息(6小时一次),当数据块汇报满足最小副本条件的时候,安全模式退出

​ DN的心跳每3s一次,用于跟NN通信。

​ 如果NN超过10min+30s没有收到某个DN的心跳,就认为这个DN不行了,不能用