HDFS元数据管理流程
2023-12-09 23:59:30 0 举报
元马超级HDFS元数据管理流程
作者其他创作
大纲/内容
createSingleDirectory(...);
内部会封装目前自己有的最大的日志ID
bufReady.writeTo(out);
EditLogTailer()
JournalNodeRpcServer.journal(...)
unprotectedMkdir(...)
op = in.readOp();
bufCurrent.writeOp(op);
线程池submit()
在内存中修改文件目录树
fsn.getFSDirectory()
buf.writeOp(op);
namenode.mkdirs(...);
返回op
写到JN
一个AsyncLogger代表一个JournalNode
写EditLog
op = reader.readOp(...);
N
建造者模式:构建一个日志对象。继承至FSEditLogOp这个枚举类,对应的Op类型:OP_MKDIR
RPC
获取文件目录树
buf.flushTo(fp);
applyEditLogOp(...)
对于standby的NameNode而言,会启动一个后台进程定期到JournalNode拉取EditLog
根据opCode选择相应的操作,对应mkdir => OP_MKDIR
logStream.flush();
editLogStream的创建
创建一个HttpURLConnection,并获取inputStream
for循环
doubleBuf.writeOp(op);
doubleBuf.flushTo(fp);
getProxy().journal(...)
EditLogFileOutputStream.flushAndSync(...)
写到本地
primitiveMkdir(...)
fsd.addLastINode(...)
EditLogFileInputStream()
EditsDoubleBuffer
loadEditRecords(...)
QuorumOutputStream.write(...)
MkdirOp
namesystem.mkdirs(...)
要创建的INode长度 > 1
log.getInputStream()
createChildrenDirectories()
logEdit(op);
AsyncLogger.sendEdits(...)
1. 分段加锁和双缓冲方案
FSNamesystem
loader.loadFSEdits(....)
要创建的目录中的最后一个INode(可能已经存在,也可能为null)
Y
双缓冲机制:bufCurrent 用于写如editlogbufReady 用于将editlogflush到磁盘
new INodeDirectory(...)
editLogStream.setReadyToFlush();
IPCLoggerChannel
DistributedFileSystem.mkdirsInternal()
nextOp();
写出到缓冲区
构建MkdirOp对象
startLogSegment(...)
write(...)
connection.getInputStream()
FSDirMkdirOp.mkdirForEditLog(...)
Synchronized
doTailEdits();
new FSEditLogLoader()
MkdirOp mkdirOp = (MkdirOp)op;
FSDirMkdirOp.mkdirs(...)
QuorumOutputStream.flushAndSync(...)
init()
第一次进来会创建Journal,然后调用journal方法,将editLog写到本地磁盘
iip.getLastINode()
补全绝对路径
DFSClient.mkdir(...)
交换bufCurrent以及bufReady
nextOpImpl(false);
doWork();
logSync();刷写到磁盘
获取一个全局递增的事物id(ThreadLocal对象)
1. 内部遍历journals,2. 在启动NameNode的时候,在配置文件中有两个参数:dfs.namenode.edits.dir 本地EditLog的存储路径dfs.namenode.shared.edits.dir HA模式下在JournalNode的存储位置会分别创建对应的JournalManager:FileJournalManagerQuorumJournalManager并将他们对应的JournalAndStream创建出来添加到journals列表中3. 然后调用他们的apply方法,在startLogSegment中实现。然后调用各个JournalManager的startLogSegment(...)方法创建相应的stream: QuorumJournalManager => QuorumOutputStream FileJournalManager => EditLogFileOutputStream
EditLogFileOutputStream.write(...)
editLogStream.write(op);
fileSystem.mkdirs(new Path(\"\"));
fixRelativePart(f);
EditLogTailerThread.run()
URLLOG
state 初始值是UNINIT,在执行完init()方法之后,会修改state为OPEN
收藏
0 条评论
下一页