HDFS面试题
- 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的元数据
- 关于java中的反射
- 关于AQS
- Parameter Attribute
- 研究者 如何思考
- #今日论文推荐# 陈天奇、王威廉等人推荐:ACL最佳论文奖得主给新入行研究者的一点建议
- Filter拦截过滤参数
- windows上搭建IOS开发环境
- 常见的软件测试类型
- 软件测试之测试分类
- 算法笔记
- 主题模型TopicModel:隐含狄利克雷分布LDA
- pageInfo的转化,do转vo
- 关于module.exports和exports
- centos 7 安装snmp
- 自媒体运营的八条建议
- chrome突然打不开网页,其他浏览器可以,解决办法
- redis工具redis Desktop Manager使用
- call和calling的用法
- 【现代控制理论】传递函数建立状态空间表达式
- Ubuntu的常用命令总结——简单版