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