【框架解析】Hadoop系统分析(八)--editlog管理

12 篇文章 0 订阅

Editlog文件记录了日常针对数据文件的操作,在Hdfs启动时,会合并fsimage文件与editlog文件,构成整个hdfs整个文件系统。对editlog进行操作主要的类有如下:


  1. FSEditLog
    操作editlog文件,包括打开、关闭、写入等操作
    1. open
      使用EditLogOutputStream打开所有的editlog文件,准备往里写入数据。
    2. close
      关闭所有打开的editlog文件
      1. 判断editlog是否处于同步中状态,如果处于正在同步日志,则等待1秒后重试直到退出同步状态。
      2. 将EditLogOutputStream中内容全部flush进文件
      3. 关闭文件
    3. createEditLogFile
      创建对应的editlog文件
    4. logEdit
      记录操作到editlog中,但是还没有进行持久化,之后将本次操作计入统计数据
      1. 参数op
        参数名称 参数值 备注
        OP_INVALID -1 日志结束时写入-1标识
        OP_ADD 0 拿到lease标识
        OP_RENAME 1 更改文件名
        OP_DELETE 2 删除文件
        OP_MKDIR 3 创建目录
        OP_SET_REPLICATION 4 更改副本数
        OP_SET_PERMISSIONS 7 设置权限
        OP_SET_OWNER 8 设置文件所有者和组
        OP_CLOSE 9 归还lease
        OP_SET_GENSTAMP 10 设置文件版本序列号
        OP_SET_NS_QUOTA 11 设置命名空间硬盘额度
        OP_CLEAR_NS_QUOTA 12 清楚命名空间硬盘额度
        OP_TIMES 13 文件更新/访问时间
        OP_SET_QUOTA 14 设置空间额度
        OP_GET_DELEGATION_TOKEN 18 获取授权标识
        OP_RENEW_DELEGATION_TOKEN 19 更新授权标识
        OP_CANCEL_DELEGATION_TOKEN 20 取消授权标识
        OP_UPDATE_MASTER_KEY 21 更新master key
    5. logOpenFile
      记录获取lease的操作,记录内容:OPP_ADD|[path(路径)|replication(副本数)|modification time(修改时间)|access time(访问时间)|prefered block size(block大小)]|[block info(block信息)]|permission status(权限状态)|client name(客户名)|client machine(客户机器名)
    6. logCloseFile
      记录释放lease的操作,记录内容:OPP_CLOSE|[path(路径)|replication(副本数)|modification time(修改时间)|access time(访问时间)|prefered block size(block大小)]|[block info(block信息)]|permission status(权限状态)
    7. logMkDir
      记录创建目录的操作,记录内容:OPP_MKDIR|[path(路径)|modification time(修改时间)|access time(访问时间)]|permission status
    8. logRename
      记录修改名称的操作,记录内容:OP_RENAME|[src(原路径)|dst(目标路径)|timestamp(重命名时间)]
    9. logSetReplication
      记录修改副本数的操作,记录内容:OP_SET_REPLICATION|src(文件路径)|replication(副本数)
    10. logSetQuota
      记录修改空间额度操作,记录内容:OP_SET_QUOTA|src(文件路径)|nsQuota(文件空间额度)|dsQuota(磁盘空间额度)
    11. logSetPermissions
      记录修改权限的操作,记录内容:OP_SET_PERMISSIONS|src(文件路劲)|permissions(权限信息)
    12. logSetOwner
      记录修改文件所有者和组的操作,记录内容:OP_SET_OWNER|src(文件路劲)|username|groupname
    13. logDelete
      记录删除文件的操作,记录内容:OP_DELETE|[src(文件路径)|操作时间]
    14. logGenerationStamp
      记录生成文件版本序列号的操作,记录内容:OP_SET_GENSTAMP|genstamp(序列号)
    15. logTimes
      记录修改访问时间和更新时间的操作,记录内容:OP_TIMES|[src(文件路径)|mtime(修改时间)|atime(访问时间)]
    16. logGetDelegationToken
      记录获取授权标识的操作,记录内容:OP_GET_DELEGATION_TOKEN|id(标识id)|expiryTime(超时时间)
    17. logRenewDelegationToken
      记录更新授权标识的操作,记录内容:OP_RENEW_DELEGATION_TOKEN|id(标识id)|expiryTime(超时时间)
    18. logCancelDelegationToken
      记录取消授权标识的操作,记录内容:OP_CANCEL_DELEGATION_TOKEN|id(标识id)|
    19. logUpdateMasterKey
      记录更新MasterKey的操作,记录内容:OP_UPDATE_MASTER_KEY|key
    20. rollEditLog
      关闭当前的edits文件,并且打开edits.new文件
      1. 如果已经存在edits.new,确认所有的edits.new一致性没问题后直接返回
      2. 否则关闭当前editlog文件,打开edits.new文件用于记录editlog
    21. purgeEditLog
      移除老的edits文件,并将edits.new重新命名为edits
    22. processIOError
      统一处理io错误
    23. logSync
      同步editlog
    24. loadFSEdits
      加载editlog,并把editlog的内容合并到内存结构中,主要根据opcode的不同将之前写入操作记录读取出来并应用到FSNameSystem中
  2. EditLogInputStream
    抽象类,封装了用于读editlog的基本操作,具体内容由EditLogFileInputStream实现
  3. EditLogFileInputStream
    对FileInputStream进行封装,同时能够获取到editlog的文件路径与文件长度
  4. EditLogOutputStream
    抽象类,封装了用于写editlog的基本操作,具体内容由EditLogFileOutputStream实现
  5. EditLogFileOutputStream
    用于将修改日志写入editlog中,主要的方法有:
    1. create
      创建一个空的edits log文件,内容只有版本号以及OP_INVALID结束标志
    2. write
      将输入的内容写入buffer
    3. setReadyToFlush
      flush前的准备,往buffer里写入OP_INVALID表示当次日志结束
    4. preallocate
      分配1MB空间用于flush日志时使用
    5. flushAndSync
      将内存中的日志写入文件,清空缓存中数据,将文件指针指向文件当前位置-1的位置(忽略OP_INVALID的文件结束标志)
    6. close
      关闭文件,释放空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值