大数据面试题之Hadoop
1.NameNode在启动的时候会做哪些操作
NameNode数据存储在内存和本地磁盘,本地磁盘数据存储在fsimage镜像文件和edits编辑日志文件
-
首次启动NameNode
1.格式化文件系统,为了生成fsimage镜像文件
2.启动NameNode
(1)读取fsimage文件,将文件内容加载进内存
(2) 等待DataNode注册与发送block report
3.启动DataNode
(1) 向NameNode注册
(2) 发送block report
(3) 检查fsimage中记录的块的数量和block report中的块的总数是否相同
4.对文件系统进行操作(创建目录,上传文件,删除文件等)
(1)此时内存中已经有文件系统改变的信息,但是磁盘中没有文件系统改变的信息,此时会将这些
改变信息写入edits文件中,edits文件中存储的是文件系统元数据改变的信息。 -
第二次启动NameNode
1.读取fsimage和edits文件
2.将fsimage和edits文件合并成新的fsimage文件
3.创建新的edits文件,内容为空
4.启动DataNode
2.Secondary NameNode了解吗?它的工作机制是怎样的
Secondary NameNode 是合并NameNode的edit logs到 fsimage文件中;
它的具体工作机制:
(1)Secondary NameNode询问NameNode是否需要checkpoint。直接带回NameNode
是否检查结果
(2) Secondary NameNode请求执行checkpoint
(3) NameNode滚动正在写的edits日志
(4) 将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
(5) Secondary NamenNode加载编辑日志和镜像文件到内存,并合并
(6) 生成新的镜像文件fsimage.chkpoint
(7) 拷贝fsimage.chkpoint 到 NameNode
(8)NameNode 将fsimage.chkpoint 重新命名成fsimage
所以如果NameNode中的元数据丢失,是可以从Secondary NameNode 恢复一部所以如果NameNode中的元数据丢失,是可以从Secondary NameNode恢复一部分元数据信息的,但是不是全部,因为Namenode正在写的edits日志还没有拷贝到Secondary NameNode,这部分恢复不了
3.Secondary NameNode 不能恢复NameNode的全部数据,那如何保证NameNode数据存储安全
这个问题就要说 NameNode 的高可用了,即 NameNode HA 一个 NameNode 有单点故障的问题,那就配置双 NameNode,配置有两个关键点,一是必须要保证这两个 NN 的元数据信息必须要同步的,二是一个 NN 挂掉之后,另一个要立马补上。
-
元数据信息同步在 HA 方案中采用的是“共享存储”。每次写文件时,需要将日志同步写入共享存储,这个步骤成功才能认定写文件成功。然后备份节点定期从共享存储同步日志,以便进行主备切换。
-
监控 NN 状态采用 zookeeper,两个 NN 节点的状态存放在 ZK 中,另外两个 NN 节点分别有一个进程监控程序,实施读取 ZK 中有 NN 的状态,来判断当前的 NN 是不是已经 down 机。如果 standby 的 NN 节点的 ZKFC 发现主节点已经挂掉,那么就会强制给原本的 active NN 节点发送强制关闭请求,之后将备用的 NN 设置为 active。
-
如果面试官再问 HA 中的 共享存储 是怎么实现的知道吗?
可以进行解释下:NameNode 共享存储方案有很多,比如 Linux HA, VMware FT, QJM 等,目前社区已经把由 Clouderea 公司实现的基于 QJM(Quorum Journal Manager)的方案合并到 HDFS 的 trunk 之中并且作为默认的共享存储实现基于 QJM 的共享存储系统主要用于保存 EditLog,并不保存 FSImage 文件。FSImage 文件还是在 NameNode 的本地磁盘上。QJM 共享存储的基本思想来自于 Paxos 算法,采用多个称为 JournalNode 的节点组成的 JournalNode 集群来存储 EditLog。每个 JournalNode 保存同样的 EditLog 副本。每次 NameNode 写 EditLog 的时候,除了向本地磁盘写入EditLog 之外,也会并行地向 JournalNode 集群之中的每一个 JournalNode 发送写请求,只要大多数 (majority) 的 JournalNode 节点返回成功就认为向 JournalNode 集群写入EditLog 成功。如果有2N+1 台 JournalNode,那么根据大多数的原则,最多可以容忍有 N台 JournalNode 节点挂掉