1、将BackupNode和BackupStorage加入0.20.2
2、将org.apache.hadoop.hdfs.DFSConfigKeys加入0.20.2
3、将CheckPointer加入
4、org.apache.hadoop.hdfs.server.common.HDFSConstants.java 增加NamenodeRole
5、为Namenode增加NameNode(Configuration conf, NamenodeRole role)的构造函数,注释掉用户验证部分代码,同时为Namenode增加一个成员role
6、为Namenode增加getRpcServerAddress、setRpcServerAddress、getHttpServerAddress、setHttperverAddress函数,修改initialize和starHttpServer,使得getRpcServerAddress和getHttpServerAddress得到应用
7、.21中rpcAddress和httpAddress = .20中的serverAddress和httpAddress,修改backupNode的getHttpServerAddress是需要用到
8、为NameNode增加loadNamesystem,同时修改initialize函数调用该函数,并在BackupNode中重载该函数,实现backupnode在启动时对Image的操作,这是代码重构的一个有效手段
9、为bacupnode实现loadNamesystem,需要为FSNamesystem增加一个构造函数FSNamesystem(NameNode nn,Configuration conf, BackupStorage bnImage) throws IOException{},backupnode在调用FSNamesyste函数是要将自身也传入进去
10、为FSNamesystem的initialize增加一个参数FSImage参数,同时修改支持传入Image情况下的naemsystem的初始化构建
11、将BackupStorage的recoverCreateRead的参数URI改为File
12、将Namenode的initialize函数改为protected
13、为namenode增加getRegistration函数:
1)将org.apache.hadoop.hdfs.server.protocol.NamenodeRegistration和org.apache.hadoop.hdfs.server.protocol.NodeRegistration从0.21中导入到0.20
2)为namenode增加成员变量nodeRegistration
3)为Namenode增加getRegistration函数
14、为NamenodeProtocol增加errorReport接口,注意不要和Namenode已经有的errorReport混淆了,已有的errorReport是给Datanode使用的,两个函数的输入参数不一样
1)NamenodeProtocol增加errorReport接口
2)Namenode中实现errorReport接口
3)Namenode增加verifyRequest(NodeRegistration nodeReg)函数
4)为0.20增加org.apache.hadoop.hdfs.protocol.UnregisteredNodeException
5)为NaemnodeProtocol增加FATAL等一系列常量
6)为FSNamesystem增加releaseBackupNode(NamenodeRegistration xx)函数,既然已经修改到这里,顺便把registerBackupNode也加入到FSNamesystem当中吧
7)为editLog增加checkupBackupRegistration(NamenodeRegistration)和releaseBackupStream(NamenodeRegistration);FSEditLog更改比较大,因此修改起来需要比较细心
i)增加了divertFileStreams,用于关闭edit,打开edit.new stream,类似于rollEditLog
ii)修改了processIOError,用于移除失败的stream,增加了一个是否传播的参数实现的方式也有所改变
iii)增加了revertFileStreams,从edit.new切换回edit,类似于.20的purgeEditLog
iv).20的循环等待过程,放入waitForSyncToFinish函数
v)由于releaseBacupNode和registerBackupNode都使用了OutputStreamIterator,因此需要把前面的OutputStreamIterator也移植过来,由于LogJSpoolStart和LogEdit也都需要,也一并移植过来
vi)为了使改动最小化,这段修改的原则是,尽量不修改.20的EditLog代码,而修改移植过来的部分代码,具体过程如下
a)从0.21中导入EditLogBackupOutputStream,估计EditLogBackupInputStream也会用到,一并倒过来吧
b)为FSEditLog增加成员OP_JSPOOL_START
c)为FSEditLog增加成员NO_JOURNAL_STREAMS_WARNING
d)将processIOError(errorStreams,true),都改为processIOError(errorStreams)
e)为FSEditog增加recordTraction函数
f)从0.21中导入JournalStream,同时在EditLogOutputStream中实现JournalStream接口,但EditLogOutput没有实现getType接口,而是在子类中实现的getType接口,将EditLogOutputStream中的getname注释掉,同时在EditLogFileOutputStream(FSEditLog.java)中,将getName和getType函数前加上public,并实现getType函数
g)EditStreamIterator的remove函数暂时应该没有用到,但因为Iterator的规范不能注释掉,所以可以增加removeStream的实现
h)readRenameOptions和toByteWritable也都暂时注释掉
15、从0.21中导入UnsupportedActionException
16、为NamenodeProtocol增加versionRequest、register、startCheckpoint、endCheckpoint、journal等接口;并且从0.21中导入org.apache.hadoop.hdfs.server.protocol.NamenodeCommand
17、为namenode增加setRegistration函数,同时增加getHostPortString函数和getRole函数
18、为FSImage增加getCheckpointTime函数,FSImage在很多方面还是有很大的变化,暂时忽略这些变化,继续前行
19、为namenode增加isRole函数
20、为namenode增加isStopRequested函数
21、为FSImage增加getCheckpointState和setCheckpointState(CheckpointStates cs)
22、从0.21导入org.apache.hadoop.classification包,用于对代码进行分类
23、去掉DFSConfigKeys的父类CommonConfigurationKeys,因为DFSConfiKeys应用非常有限,不必在意
24、由于backupNode需要用到checkpointer,因此下面需要解决Checkpointer的问题:
1)从0.21导入org.apache.hadoop.hdfs.server.protocol.CheckpointComand,
2)将namenode的HttpServer httpServer由private改成protected
3)为FSImage增加getFiles函数
4)从0.21中导入org.apache.hadoop.hdfs.server.protocol.ServerCommand
25、开始解决EditLogBackupInputStream的问题,解决办法是为EditLogInputStream增加一个JournalStream的接口实现,与OutputStream类似,同时要注释掉getName函数,在EditLogFileInputStream添加和修改getName和getType的实现,注意修改这两个函数都为public
26、解决EditLogBackupOutputStream的问题
1)将创建backupnode时使用的HdfsConfiguration改成org.apache.hadoop.conf.Configuration
2)将FSEditLog.OP_INVALID由private改成public
27、BackupStorage是个问题大户,我们来看看如何解决:
1)因为在0.20中,EditLogFileInputStream没有单独的文件,因此可以冲import中删除,EditLogFileInputStream实现在FSImage.java当中
2)为了BackupStorage继承的需要,将FSImage的editLog从private改为protected
3)为了减少影响,对BackupStorage的实现进行适当的修改,journal函数中loadEditRecords改为loadFSEdits,同时注释掉updateCountForINodeWithQuota,这个函数不知干什么用的
4)将BackupStorage中函数getFSNamesystem都修改为FSNamesystem.getFSNamesystem
5)将loadCheckpoint中调用的isEmpty()函数改写为isDirEmpty("/");
6)为EditLog添加diverFileStreams和revertFileStreams,这两个函数主要为BackupStorage开启和关闭jouranl spool使用,
i)为了增加这两个函数还要为EditLog增加waitForSyncToFinish,同时注释掉getNumEditsDirs,EditLogFileOutputStream构造时,去掉sizeOutputFlushBuffer参数,processIOError去掉true参数
ii)revertFileStream的修改与diverFileStream类似
7)为FSImage增加setCheckpointTime函数,这个函数是journal函数调用的,有namenode发起设置backupnode的CheckpointTime,但好像namenode从来也没有发起这样的操作,namenode通过send函数rpc调用journal,namenode在EditLogBackupOoutputStream::flushAndSync中发送JA_JOURNAL,另外在EditLogBackupOutputStream::isAlive中发送JA_IS_ALIVE,因此这个JA_CHECKPOINT_TIME好像没有用到,同样的JA_SPOOL_START好像也没有用到
8)因为在0.20版本中,FSEditLogInputStream和FSEditLogOutputStream都在FSEditLog.java中,因此convergeJournalSpool函数创建edits时需要import org.apache.hdfs.server.namenode.FSEditLog.EditLogInputStream,或者在创建时new一个FSEditLog.EditLogInputStream
9)为EditLogInputStream增加一个函数getDataStream,用于为EditLogInputStream构建对应的DataInputStream,getDataStream的可见性设置为public
10)由于在0.20中,eidts load完毕后,就可以关闭了,但对于edit spool来说,load完毕后,还不能关闭,因此在0.21中loadFSEdits增加了一个参数来决定是否需要关闭,在convergeJournalSpool时,load完edits,不能关闭,因此需要为0.20的loadFSEdits增加这个开关,为了使原来loadFSEdits的客户可以继续工作,需要通过新的loadFSEdits实现原来函数的功能,需要注意的是loadFSEdit(DataInputStream edits, boolean closeOnExit)第一个参数要从EditLogInputStream更改为DataInputStream,同时在loadFSEdits(EditLogInputStream)中通过getDataInputStream可以将EditLogInputStream转为DataInputStream,在BackupStorage::convergeJournalSpool函数中,将loadEditRecords改为调用loadFSEdits
11)由于BackupStorage需要更新version和fstime files,因此需要将原本在FSImage::rollFSImage中的更新version和fstime files的操作单独实现在resetVersion函数中,在rollFSImage函数中调用resetVersion
12)为FSImage添加函数moveLastCheckpoint(StorageDirectory sd)
13)在0.21版本的FSImage中,增加了一个函数saveNamespace,需要在0.20版本中增加该函数,同时将saveNamespace的访问权限指定为protected,奇怪的是.21的版本没有指定访问权限,竟然可以,为什么呢?
i)增加辅助函数saveCurrent和moveCurrent
ii)增加processIOError(ArrayList<StroageDirectory> sds, bool propagrate)函数,这个函数可以处理一批失效的目录,如果设置了propagrate参数为true,将关闭这些目录所对应的edits
a)为FSEditLog增加getEditStream函数
b)将processIOError中editLog.processIOError的第2个参数去掉,同时将FSEditLog中processIOError的访问权限由private改为public
14)下面解决reset函数的问题,reset函数被BackupNode的resetNamespace调用,最终被Checkpointer::doCheckpoint使用,也就是当只有namenode保存image时,需要清空backupnode的fsdirectory。
i)为FSDirectory增加reset函数,同时将reset函数的实现中,getFSNamesystem改成FSNamesystem.getFSNamesystem,同时将rootDir的final修饰去掉,同时将reset的访问权限设置为public
ii)为FSImage添加getDirectories、getImageDirectories、getEditsDirectories函数,将函数的返回值都改为Collection<File>,同时getDirectories也要做适当的修改
28、因为修改了NamenodeProtocol,而namenode实现了NamenodeProtocol接口,因此需为增加的接口函数在namenode中添加缺省实现,主要包括:register、startCheckpoint、endCheckpoint、journalSize,journal
至此,应该基本修改完毕。
-----------------
logJSpoolStart函数:先查找backupnamenode,是否已经添加进来,如果没有,为注册的baupnode创建一个outputstream
logEdit:被journal函数调用的方法,是backupnode使用的用于写EditLog,这个函数还要仔细理解一下,尤其是为什么要调用recordTraction,而且为什么backupnode写editlog和namenode写editlog不一样?
2、将org.apache.hadoop.hdfs.DFSConfigKeys加入0.20.2
3、将CheckPointer加入
4、org.apache.hadoop.hdfs.server.common.HDFSConstants.java 增加NamenodeRole
5、为Namenode增加NameNode(Configuration conf, NamenodeRole role)的构造函数,注释掉用户验证部分代码,同时为Namenode增加一个成员role
6、为Namenode增加getRpcServerAddress、setRpcServerAddress、getHttpServerAddress、setHttperverAddress函数,修改initialize和starHttpServer,使得getRpcServerAddress和getHttpServerAddress得到应用
7、.21中rpcAddress和httpAddress = .20中的serverAddress和httpAddress,修改backupNode的getHttpServerAddress是需要用到
8、为NameNode增加loadNamesystem,同时修改initialize函数调用该函数,并在BackupNode中重载该函数,实现backupnode在启动时对Image的操作,这是代码重构的一个有效手段
9、为bacupnode实现loadNamesystem,需要为FSNamesystem增加一个构造函数FSNamesystem(NameNode nn,Configuration conf, BackupStorage bnImage) throws IOException{},backupnode在调用FSNamesyste函数是要将自身也传入进去
10、为FSNamesystem的initialize增加一个参数FSImage参数,同时修改支持传入Image情况下的naemsystem的初始化构建
11、将BackupStorage的recoverCreateRead的参数URI改为File
12、将Namenode的initialize函数改为protected
13、为namenode增加getRegistration函数:
1)将org.apache.hadoop.hdfs.server.protocol.NamenodeRegistration和org.apache.hadoop.hdfs.server.protocol.NodeRegistration从0.21中导入到0.20
2)为namenode增加成员变量nodeRegistration
3)为Namenode增加getRegistration函数
14、为NamenodeProtocol增加errorReport接口,注意不要和Namenode已经有的errorReport混淆了,已有的errorReport是给Datanode使用的,两个函数的输入参数不一样
1)NamenodeProtocol增加errorReport接口
2)Namenode中实现errorReport接口
3)Namenode增加verifyRequest(NodeRegistration nodeReg)函数
4)为0.20增加org.apache.hadoop.hdfs.protocol.UnregisteredNodeException
5)为NaemnodeProtocol增加FATAL等一系列常量
6)为FSNamesystem增加releaseBackupNode(NamenodeRegistration xx)函数,既然已经修改到这里,顺便把registerBackupNode也加入到FSNamesystem当中吧
7)为editLog增加checkupBackupRegistration(NamenodeRegistration)和releaseBackupStream(NamenodeRegistration);FSEditLog更改比较大,因此修改起来需要比较细心
i)增加了divertFileStreams,用于关闭edit,打开edit.new stream,类似于rollEditLog
ii)修改了processIOError,用于移除失败的stream,增加了一个是否传播的参数实现的方式也有所改变
iii)增加了revertFileStreams,从edit.new切换回edit,类似于.20的purgeEditLog
iv).20的循环等待过程,放入waitForSyncToFinish函数
v)由于releaseBacupNode和registerBackupNode都使用了OutputStreamIterator,因此需要把前面的OutputStreamIterator也移植过来,由于LogJSpoolStart和LogEdit也都需要,也一并移植过来
vi)为了使改动最小化,这段修改的原则是,尽量不修改.20的EditLog代码,而修改移植过来的部分代码,具体过程如下
a)从0.21中导入EditLogBackupOutputStream,估计EditLogBackupInputStream也会用到,一并倒过来吧
b)为FSEditLog增加成员OP_JSPOOL_START
c)为FSEditLog增加成员NO_JOURNAL_STREAMS_WARNING
d)将processIOError(errorStreams,true),都改为processIOError(errorStreams)
e)为FSEditog增加recordTraction函数
f)从0.21中导入JournalStream,同时在EditLogOutputStream中实现JournalStream接口,但EditLogOutput没有实现getType接口,而是在子类中实现的getType接口,将EditLogOutputStream中的getname注释掉,同时在EditLogFileOutputStream(FSEditLog.java)中,将getName和getType函数前加上public,并实现getType函数
g)EditStreamIterator的remove函数暂时应该没有用到,但因为Iterator的规范不能注释掉,所以可以增加removeStream的实现
h)readRenameOptions和toByteWritable也都暂时注释掉
15、从0.21中导入UnsupportedActionException
16、为NamenodeProtocol增加versionRequest、register、startCheckpoint、endCheckpoint、journal等接口;并且从0.21中导入org.apache.hadoop.hdfs.server.protocol.NamenodeCommand
17、为namenode增加setRegistration函数,同时增加getHostPortString函数和getRole函数
18、为FSImage增加getCheckpointTime函数,FSImage在很多方面还是有很大的变化,暂时忽略这些变化,继续前行
19、为namenode增加isRole函数
20、为namenode增加isStopRequested函数
21、为FSImage增加getCheckpointState和setCheckpointState(CheckpointStates cs)
22、从0.21导入org.apache.hadoop.classification包,用于对代码进行分类
23、去掉DFSConfigKeys的父类CommonConfigurationKeys,因为DFSConfiKeys应用非常有限,不必在意
24、由于backupNode需要用到checkpointer,因此下面需要解决Checkpointer的问题:
1)从0.21导入org.apache.hadoop.hdfs.server.protocol.CheckpointComand,
2)将namenode的HttpServer httpServer由private改成protected
3)为FSImage增加getFiles函数
4)从0.21中导入org.apache.hadoop.hdfs.server.protocol.ServerCommand
25、开始解决EditLogBackupInputStream的问题,解决办法是为EditLogInputStream增加一个JournalStream的接口实现,与OutputStream类似,同时要注释掉getName函数,在EditLogFileInputStream添加和修改getName和getType的实现,注意修改这两个函数都为public
26、解决EditLogBackupOutputStream的问题
1)将创建backupnode时使用的HdfsConfiguration改成org.apache.hadoop.conf.Configuration
2)将FSEditLog.OP_INVALID由private改成public
27、BackupStorage是个问题大户,我们来看看如何解决:
1)因为在0.20中,EditLogFileInputStream没有单独的文件,因此可以冲import中删除,EditLogFileInputStream实现在FSImage.java当中
2)为了BackupStorage继承的需要,将FSImage的editLog从private改为protected
3)为了减少影响,对BackupStorage的实现进行适当的修改,journal函数中loadEditRecords改为loadFSEdits,同时注释掉updateCountForINodeWithQuota,这个函数不知干什么用的
4)将BackupStorage中函数getFSNamesystem都修改为FSNamesystem.getFSNamesystem
5)将loadCheckpoint中调用的isEmpty()函数改写为isDirEmpty("/");
6)为EditLog添加diverFileStreams和revertFileStreams,这两个函数主要为BackupStorage开启和关闭jouranl spool使用,
i)为了增加这两个函数还要为EditLog增加waitForSyncToFinish,同时注释掉getNumEditsDirs,EditLogFileOutputStream构造时,去掉sizeOutputFlushBuffer参数,processIOError去掉true参数
ii)revertFileStream的修改与diverFileStream类似
7)为FSImage增加setCheckpointTime函数,这个函数是journal函数调用的,有namenode发起设置backupnode的CheckpointTime,但好像namenode从来也没有发起这样的操作,namenode通过send函数rpc调用journal,namenode在EditLogBackupOoutputStream::flushAndSync中发送JA_JOURNAL,另外在EditLogBackupOutputStream::isAlive中发送JA_IS_ALIVE,因此这个JA_CHECKPOINT_TIME好像没有用到,同样的JA_SPOOL_START好像也没有用到
8)因为在0.20版本中,FSEditLogInputStream和FSEditLogOutputStream都在FSEditLog.java中,因此convergeJournalSpool函数创建edits时需要import org.apache.hdfs.server.namenode.FSEditLog.EditLogInputStream,或者在创建时new一个FSEditLog.EditLogInputStream
9)为EditLogInputStream增加一个函数getDataStream,用于为EditLogInputStream构建对应的DataInputStream,getDataStream的可见性设置为public
10)由于在0.20中,eidts load完毕后,就可以关闭了,但对于edit spool来说,load完毕后,还不能关闭,因此在0.21中loadFSEdits增加了一个参数来决定是否需要关闭,在convergeJournalSpool时,load完edits,不能关闭,因此需要为0.20的loadFSEdits增加这个开关,为了使原来loadFSEdits的客户可以继续工作,需要通过新的loadFSEdits实现原来函数的功能,需要注意的是loadFSEdit(DataInputStream edits, boolean closeOnExit)第一个参数要从EditLogInputStream更改为DataInputStream,同时在loadFSEdits(EditLogInputStream)中通过getDataInputStream可以将EditLogInputStream转为DataInputStream,在BackupStorage::convergeJournalSpool函数中,将loadEditRecords改为调用loadFSEdits
11)由于BackupStorage需要更新version和fstime files,因此需要将原本在FSImage::rollFSImage中的更新version和fstime files的操作单独实现在resetVersion函数中,在rollFSImage函数中调用resetVersion
12)为FSImage添加函数moveLastCheckpoint(StorageDirectory sd)
13)在0.21版本的FSImage中,增加了一个函数saveNamespace,需要在0.20版本中增加该函数,同时将saveNamespace的访问权限指定为protected,奇怪的是.21的版本没有指定访问权限,竟然可以,为什么呢?
i)增加辅助函数saveCurrent和moveCurrent
ii)增加processIOError(ArrayList<StroageDirectory> sds, bool propagrate)函数,这个函数可以处理一批失效的目录,如果设置了propagrate参数为true,将关闭这些目录所对应的edits
a)为FSEditLog增加getEditStream函数
b)将processIOError中editLog.processIOError的第2个参数去掉,同时将FSEditLog中processIOError的访问权限由private改为public
14)下面解决reset函数的问题,reset函数被BackupNode的resetNamespace调用,最终被Checkpointer::doCheckpoint使用,也就是当只有namenode保存image时,需要清空backupnode的fsdirectory。
i)为FSDirectory增加reset函数,同时将reset函数的实现中,getFSNamesystem改成FSNamesystem.getFSNamesystem,同时将rootDir的final修饰去掉,同时将reset的访问权限设置为public
ii)为FSImage添加getDirectories、getImageDirectories、getEditsDirectories函数,将函数的返回值都改为Collection<File>,同时getDirectories也要做适当的修改
28、因为修改了NamenodeProtocol,而namenode实现了NamenodeProtocol接口,因此需为增加的接口函数在namenode中添加缺省实现,主要包括:register、startCheckpoint、endCheckpoint、journalSize,journal
至此,应该基本修改完毕。
-----------------
logJSpoolStart函数:先查找backupnamenode,是否已经添加进来,如果没有,为注册的baupnode创建一个outputstream
logEdit:被journal函数调用的方法,是backupnode使用的用于写EditLog,这个函数还要仔细理解一下,尤其是为什么要调用recordTraction,而且为什么backupnode写editlog和namenode写editlog不一样?