04-HDFS的mkdir创建过程
2021-01-25 16:44:50 6 举报
HDFS的mkdir创建过程
作者其他创作
大纲/内容
1
写入 journalNode
httpUrlConnection
返回Editslog之后,写入本地元数据
getEditLog().logSync()
EditsDoubleBuffer 双缓冲区
阻塞等待返回loggers.waitForWriteQuorum
JournalNodeRpcServer
磁盘文件
INodeDirectory
当前时间和上次checkpoint的时间差 > 3600S(1小时 )
mkdirs
response.getOutputStream()
image.loadEdits
拉取文件
刷盘
run
journal
GetJournalEditServlet
DistributedFileSystem
INodeDirectory 目录
Journal
FSEditLogOp
交换两块缓冲区就是,一块已经写满了,另一块切换过来进行继续写,写满的那块进行刷盘
TxnBufferbufCurrent
NameNodeRpcServer
EditLogTailerThread
mkdir /usr/local/test/song
NameNode active
sendEdits
满足一条即可
ListeningExecutorService单线程线程池
发送http请求
发给jorunalNode
curSegment.flush
JournalNode
zk 去选择哪个是active 还是 standby
重要
把推送过来的Fsimage文件,写入磁盘
FileInputStream
创建目录
INodeDirectory
该线程在NameNode初始化的时候,会进行启动,具体查看NameNode 826行得初始化
FSEditLogLoader
EditLogOutputStream curSegment
设置 txid txid ++
List<INode> children
获取standby namenode中,edit log最大的txid
edits_000000000000000003-00000000000000000004
磁盘
FSImage
editLogStream.write(op)
StandbyCheckpointer
IPCLoggerChannel
fsimage_0000000000000000767.md5
createSingleDirectory
INodeDirectory
JournalNodeHttpServer
FSNamesystem
JournalSetOutputStream
更新edits_log
TxnBufferbufReady
TxnBuffer extends DataOutputBuffer(java原生)
该线程在NameNode初始化的时候,会进行启动,具体查看NameNode 826行得初始化
checkOperation(OperationCategory.WRITE)
DataOutputBuffer# write
还没有合并到fsimage 的 editlog的数量 > 100万条
endTransaction(start)结束当前的Transaction
阻塞等待
client
休眠60秒
AsyncLogger 接口
权限检查
check point
JorunalNode 集群
edits_inprogress_00000000000000000005 (正在使用的日志文件)
writeFileToPutRequest注意这里其实是http的请求
上一步得方法里面已经刷了一次,这里不理解为何又要再刷一次
while无限循环
logMkDir
这里会while ture 一直从journalnode中拉取数据,直到全部拉完退出休眠60s
创建一个新的edits_inprogress文件并且把之前的文件固定为startTransactionId ~ endTransactionId 的一个文件
Y
DFSClient
检查是否处于安全模式
写入缓冲区
volatile long txid
写入内存 buffer
doCheckpoint()执行
2
ListenableFuture :返回写入成功失败JorunalNode 集群 中的多个JorunalNode写入成功,才算成功*等待法定人数的记录者响应给定的呼叫。如果无法达到法定人数*,则抛出QuorumException。
checkNameNodeSafeMode
NameNode standby
发送RPC请求
异步调用submit
刷盘 write
loader.loadFSEdits
如果长时间未接收新得editlog
Edits log刷入磁盘
从JorunalNode拉取数据
FSDirMkdirOp.mkdirs
写日志 刷磁盘交换
edits_000000000000000001-00000000000000000002
通过路径层级创建 INodeDirectory
TransferFsImage.uploadImageFromStorage通过线程池向active NameNode 发送Fsimage文件
写入磁盘
NameNodeHttpServer
bufCurrent.size() >= initBufferSize
rollEditLog
logStream.flush()
applyEditLogOp写入原数据区
输入磁盘、清空缓存
createChildrenDirectories
fsimage_0000000000000000767
继承
douGet
doTailEdits
QuorumOutputStream
op = in.readOp()远程拉取文件
当前缓冲区的大小 > 初始化时缓冲区的大小
EditLogFileOutputStream
logSync刷盘
EditLogTailer
60S检查一次是否要进行checkpoint
判断是否需要刷入磁盘
TransactionId属性:txid
INodeFile
CheckpointerThread
RPC调用
写edit log日志
logEdit(op)
FSEditLog
生成FSImage文件
INodeFile 文件
0 条评论
下一页