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 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 