1. Trash.Emptier
  1. hdfs中删除文件后会将文件存放到用户目录的下的.Trash/子目录中,每隔一段时间Trash.Emptier线程进行彻底删除,在这段时间用户仍然可以把误删除的文件恢复。
  2. 清空.Trash的时间间隔默认为60分钟,可以使用fs.trash.interval进行配置调整。如果interval设置为0则表示垃圾回收功能关闭。
  3. Trash.Emptier线程在NameNode的初始化方法中启动Namenode.startTrashEmptier.
  4. Trash中主要涉及到三个方法
  1. moveToTrash
    删除文件时将文件移到.Trash目录中,如果.Trash中已经存在同名文件,则把后删除的文件名尾部增加后缀1(如果Trash有n的同名文件,则增加n+1)
  2. checkpoint
    将.Trash/Current目录修改为当前时间戳的.Trash/yyMMddHHmm,等待下次执行emptier时将整个时间戳目录删除。
  3. expunge
    遍历在checkpoint时建立的.Trash/yyMMddHHmm目录,如果超出interval时间则将其删除。
  1. LeaseManager
  1. Lease管理器,对hdfs文件进行写入操作时,需要先获取该文件的lease,操作完成后,释放文件的lease
  2. FSNamesystem进行初始化时,会后台启动LeaseManager.Monitor线程,每隔2s调用一次checkLease进行检查。
  3. LeaseManager.Lease
    管理文件Lease的基本信息,主要包括:
  1. holder,这个lease的持有者
  2. lastUpdate,最近更新时间
  3. expiredHardLimit,lease硬超时,如果超时,则将lease整个清空,并从LeaseManager中删除
  4. expiredSoftLimit,lease软超时,如果超时,给lease分配一个HdfsConstants.NN_RECOVERY_LEASEHOLDER作为holder。
  5. paths,该lease对应的文件路径
  1. 主要涉及的方法
  1. addLease
    添加lease。如果lease不存在,则将lease加入到lease集合中;如果lease存在,则刷新lease时间戳。
  2. removeLease
    从lease集合中移除lease
  3. reassignLease
    重新分配lease。如果lease不为空,先移除旧的lease,之后将lease添加到集合中
  4. renewLease
    更新lease时间戳。
  5. changeLease
    修改lease对应的path内容
  6. removeLease
    从lease列表中删除lease
  7. checkLeases
    检查lease集合,如果lease过期了,就释放lease后从集合中删除lease。
  1. HeartbeatMonitor
    监控heartbeat运行状态的后台线程,每隔5s运行一次,主要有两个工作:
  1. heartbeatCheck
  1. 检测datanode是否正常运行
  2. 默认每隔5分钟执行一次,可以通过heartbeat.recheck.interval进行配置
  3. 遍历heartbeats中保存的datanode列表,判断datanode是否已经超时。超时时间根据heartbeatExpireInterval进行判断,若是超时,则将它从datanodeMap从清除。
  1. updateAccessKey,更新datanode的访问key
  1. 调用BlockTokenSecretManager.updateKeys,更新currentKey
  1. SafeModeMonitor
    每秒执行一次,通过fsRunning和safeMode判断是否可以退出SafeMode。确认可以退出后执行leaveSafeMode退出SafeMode,结束线程。
  2. ReplicationMonitor
  1. 监控replication状态,计算并处理replication的复制工作
  2. 默认每3s执行一次,可以通过修改dfs.replication.interval来调整执行间隔
  3. 主要执行以下工作:
  1. computeDatanodeWork
    计算datanode需要处理的replication数量,主要包括当前超时挂起的replication,需要进行复制的replication,计划处理的replication,损坏的replication。将这些数据记录下来,在下次heartbeat时候通知给datanode处理。
  2. processPendingReplications
    处理超时挂起的replication,将超时的replication加入到需要进行replication操作的队列中。
  1. DecommissionManager
  1. 用于管理处于Decomission状态的datanode节点。
  2. 当datanode的状态为DECOMMISSION_INPROGRESS时,调用FSNamesystem.checkDecommissionStateInternal进行检查,如果checkDecommissionStateInternal返回true,则将datanode设置为DECOMMISSIONED状态,表示可以删除
  1. 如果该datanode上的block在其他节点已经存在备份,则返回false,表示可以撤销该datanode
  2. 如果该datanode上的block在其他节点还没有备份,则将block加入neededReplications后返回true,表示还不能撤销该datanode
  1. 设置dfs.namenode.decommission.interval参数,表示进行check的时间间隔,默认30s
  2. 设置dfs.namenode.decommission.nodes.per.interval参数,表示每次检查多少个处于DECOMMISSION_INPROGRESS状态的datanode,默认5个。