FSEditLog是操作日志文件的入口类,它负责记录日志,创建日志文件,roll日志文件等。FSeditLog本身
是一个状态机,比如在roll一个日志文件与新开一个日志文件之间,它的状态是BETWEEN_LOG_SEGMENTS
先看一下日志文件的组织结构:
Namenode的元数据文件夹是存放fsimage文件和editlog文件的文件夹,由hdfs-site.xml配置文件的
dfs.namenode.name.dir配置项配置,在这个示例中,元数据文件夹是data/dfs.name目录。其他相关文件
的解释可见《Hadoop 2.X HDFS源码剖析》3.1.3节关于FSEditLog类的讲解中。
FSEditLog类最重要的字段是journalSet,它在initJournals()方法中初始化journalSet中的journals,
逻辑是这样的,通过遍历传入的List<URI>,如果URI对应的是本地目录则创建FileJournalManager,然
后添加进journals,否则根据URI的scheme创建其他的JournalManager.
editlog文件可以存储在本地文件上(FileJournalManager与之对应),也可以存储在其他节点上
(QuorumJournalManager与之对应),不同的JournalManager对应不同的输出流,输出流在
JournalManager使用startLogSegment()时返回。在HDFS的逻辑中,记录日志直接调用输出流即可,
当涉及到日志文件的合并(roll)等其他操作时是使用对应的JournalManager来干活。
JournalSet是JournalManager实现类中特殊的一个类。前文已经指出,一个editlog文件可能对应多个
JournalManager。而journalSet就是将这些journalManager聚集过来,然后journalSet也表现成一个
JournalManager,然后FSEditLog类只需要操作一个JournalManager类--JournalSet即可。JournalSet的内
部逻辑是,通过字段journals记录所有的JournalManager及与之对应的输出流,当FSEditlog调用它的方
法时,遍历journals并执行相同的操作。