HDFS面试题

时间: 2023-07-18 admin 互联网

HDFS面试题

HDFS面试题

HDFS

一、HDFS的构成

元数据:目录结构和块的位置信息
元数据存放在内存中,默认情况下,每个文件的元数据大概有150B字节

  • NameNode:负责管理元数据
  • DataNode:负责存储实际数据
  • SecondaryNameNode:辅助NameNode对元数据的管理

1、NameNode概述(了解)

  • 是HDFS的核心,也被称为Master
  • 仅存储HDFS的元数据:目录结构和文件的块列表及其位置信息
  • 不存储实际数据或数据集。数据本身实际存储在DataNodes中
  • 知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道如何从块中构建文件
  • 并不持久化存储每个文件中各个块所在的DataNode的位置信息,这些信息会在系统启动时从数据节点重建
  • 对于HDFS至关重要,当NameNode关闭时,HDFS / Hadoop集群无法访问
  • 是Hadoop集群中的单点故障
  • 所在机器通常会配置有大量内存(RAM)

2、DataNode概述(了解)

  • 负责将实际数据存储在HDFS中,也被称为Slave
  • 启动时,它将自己发布到NameNode并汇报自己负责持有的块列表
  • 因为实际数据存储在DataNode中,所以其机器通常配置有大量的硬盘空间
  • 会定期(dfs.heartbeat.interval配置项配置,默认是3秒)向NameNode发送心跳,如果NameNode长时间没有接受到DataNode发送的心跳, NameNode就会认为该DataNode失效(10分钟 + 30s)
  • block(块)汇报时间间隔取参数dfs.blockreport.intervalMsec,参数未配置的话默认为6小时

3、NameNode和DataNode小结

NameNode => HDFS核心组件 => 负责管理整个HDFS集群

  • 不保存具体数据,主要保存元数据 => 放置在内存,所以在配置时需要大量的内存

DataNode => HDFS组件 => 负责具体数据/数据集存储,需要占用大量磁盘空间,某个机器故障并不影响整个集群的使用,datanode需要每个3s发送一次心跳信息。

  • datanode需要每隔3s发送一次心跳信息
  • datanode启动时会自动向namenode汇报1次本节点的块文件信息
  • datanode实现数据冗余存储(副本机制)

二、五大机制

1、切片机制

HDFS中的文件在物理上是分块(block)存储的,块的大小可以通过配置参数来规定,在hadoop2.x版本中默认大小是128M

2、汇报机制

① HDFS集群重新启动的时候,所有的DataNode都要向NameNode汇报自己的块信息
② 当集群在正常工作的时,间隔一定时间(6小时)后DataNode也要向NameNode汇报一次自己的块信息

3、心跳检测机制

NameNode与DataNode依靠心跳检测机制进行通信

① DataNode每3秒给NameNode发送自己的心跳信息
② 如果NameNode没有收到心跳信息,则认为DataNode进入“假死”状态。DataNode在此阶段还会再尝试发送10次(30s)心跳信息
③ 如果NameNode超过最大间隙时间(10分钟)还未接收到DataNode的信息,则认为该DataNode进入“宕机”状态
④ 当检测到某个DataNode宕机后,NameNode会将该DataNode存储的所有数据重新找台活跃的新机器做备份

4、负载均衡

让集群中所有的节点(服务器)的利用率和副本数尽量都保持一致或在同一个水平线上

5、副本机制

① 副本的默认数量为3
② 当某个块的副本小于3份时,NameNode会新增副本
③ 当某个块的副本大于3份时,NameNode会删除副本
④ 当某个块的副本数小于3份且无法新增的时候,此时集群会强制进入安全模式(只能读,不能写)


三、块的存储


通过机架感知原理 + 网络拓扑结构实现副本摆放

  • 第1个副本:优先本机存放,否则就近随机
  • 第2个副本:放在与第1个副本就近不同机架上的某一个服务器
  • 第3个副本:与第2个副本相同机架的不同服务器。
  • 如果还有更多的副本:随机放在各机架的服务器中。

四、HDFS的读写流程

1、读操作


① 客户端向NameNode请求读取文件

② NameNode检查该文件是否存在以及该客户端是否具有读权限,有一个不满足则返回报错信息
两者都有则根据“机架感知原理”和“网络拓补图”,返回存储该文件的块地址(存储该文件的DataNode列表)

③ 客户端拿到返回的块地址后,并行的读取DataNode列表中对应的块信息
如果之前读取的是部分块的信息,则在这些块数据读取完毕后会重新请求NameNode 获取 剩下的块地址重新读取,直至所有数据块的信息读取完毕

⑤ 最后拼接块信息得到最终的文件

至此,读取文件操作完成


2、写操作


① 客户端向NameNode请求上传文件

② NameNode检查是否已存在要上传的文件,如果已有则拒绝请求
如文件不存在则继续检查该客户端在待上传的目录下是否有写权限,如果无权限则返回报错信息,有权限则给客户端返回可以上传的信息

③ 客户端接收可以上传的信息后,对文件进行切块

④ 客户端重新请求NameNode,询问第一个数据块的上传位置

⑤ NameNode接收到客户端的请求后,根据副本机制、负载均衡、机架感知原理和网络拓补图,找到存储第一个数据块的DataNode列表(例如node1、node2、node3)后告知客户端

⑥ 客户端根据接收到的DataNode列表,连接就近的节点(例如node1)

⑦ 第一个节点收到请求后会与DataNode列表中的其他节点进行连接,形成“传输管道”,然后客户端通过数据报包(对数据块再进行切分)的方法开始给节点传输第一个数据块

⑧ 节点接收到数据块后,需要告知客户端块信息已上传成功
所以node3接收到信息后会反馈给node2已接收,node2再反馈给node1已接收,最后node1告知客户端已上传成功
这一步也称为【构建反向应答机制】

⑨ 第一个数据块上传完成后,客户端继续请求NameNode询问第二个数据块的上传位置,重复第四到第八步的操作,直至所有的数据块上传成功

至此,写文件操作完成


五、HDFS元数据管理机制

HDFS元数据按类型划分为两部分

  • 持久化存储:

    • 文件、目录自身的属性信息,例如文件名,目录名,修改信息
    • 文件存储的相关信息,例如存储块信息,分块情况,副本个数
  • 非持久化存储: DataNode节点中的数据块信息


1、如何持久化存储数据?

答:通过fsimage和edits log

fsimage(镜像文件)

  • 保存Hadoop文件系统中的所有目录和元数据信息,但不保存文件块位置的信息
  • 文件块位置信息只存储在内存中,是Namenode在DataNode加入集群时询问得到,并且间断的更新

edits log(编辑日志)

  • 保存客户端对Hadoop集群的事务性操作记录(增、删、改)

2、SeconderyNameNode辅助管理元数据的流程

图解

原理

第一阶段:启动NameNode

① 如果是首次启动namenode格式化,则新建fsimage(镜像文件)和edits log(编辑日志)
如果是非首次启动,则直接加载fsimage和edits log到内存中

② 客户端对元数据的增删改操作会实时的写入到edits log

第二阶段:SecondaryNameNode开始工作

③ SecondaryNameNode会实时检查edits log的状态,只要满足一定阈值时(1小时或修改达到100W次)后就通知NameNode重新生成一个新的edits log文件,后续将操作记录写入新文件中

④ SecondaryNameNode通过HTTP协议拉取NameNode中的fsimage和edits log到本地

⑤ 对拉取过来的edits log和fsimage加载到内存中进行合并操作(这个过程也成为Checkpoint),形成新的fsimage文件

⑥ 把新的fsimage推送给NameNode,替换旧fsimage


2.1、小细节

① 产生的edits log和fsiamge不会被立即删除,而是在集群重启或者这些文件达到一定量级后才会删除

② 对edits log和fsimage的合并操作实在SecondaryNameNode实现的,整个过程NameNode不参与

③ 实际开发中,NameNode和SecondaryNameNode一般部署在不同的服务器上,两者的配置几乎一样,只是SecondaryNameNode内存要稍微大点

④ 紧急情况下,SecondaryNameNode可以用来恢复NameNode的元数据