1.原理
如下图我红色标出的字所示,元数据核心点就在于引入双缓冲机制+分段加锁,详细内容可以参考我的Notion笔记:
https://prickle-art-18b.notion.site/1-2-HDFS-b60e89aaf677487a9bc666edd6a01815
大致步骤:
-
第一次启动NameNode前的格式化(hdfs namenode -format)操作会创建 fsimage 和 editlog 文件,启动之后会把 fsimage 加载到内存。
-
客户端写数据,会先记录到 editlog文件中,editlog 修改完成之后,会再更新内存中的文件系统镜像(WAL)
-
JournalNode同步元数据(时刻监测EditLog文件)(共享存储系统是实现高可用关键)
2.源码流程图
大致可以分为以下步骤:
-
双缓冲机制+分段加锁 —> 磁盘写 变 内存写
-
new path传入目录路径(FileTest.java —> DistributedFileSystem.java —> DFSClient.java)
-
NameNodeRpcServer.java —> FSNamesystem.java
-
到达FSDirectory目录树类,创建目录
-
通过editlog调用,拿到两种stream向JournalNode和NameNode写日志(都用到双缓冲区,见上面图)
-
NameNode落盘
-
备用NameNode同步元数据(走http方式)(StandbyCheckpointer.java)
-
上传数据到active namenode