1. 在HMaster.finishInitialization方法中触发MasterFileSystem的构造函数 2. MasterFileSystem的构造函数做的事: hbase-site.xml文件中定义了一个"hbase.rootdir"属性,这个属性不能缺少, 否则会出这样的错: java.lang.IllegalArgumentException: Can not create a Path from a null string at org.apache.hadoop.fs.Path.checkPathArg(Path.java:75) at org.apache.hadoop.fs.Path.<init>(Path.java:85) at org.apache.hadoop.hbase.util.FSUtils.getRootDir(FSUtils.java:451) MasterFileSystem的构造函数中先取出这个属性的值,保存到Path rootdir这个字段中 这是windows下的配置样例: <property> <name>hbase.rootdir</name> <value>file:/E:/hbase/data</value> </property> 然后按照此变量和当前配置(Configuration),得到一个org.apache.hadoop.fs.FileSystem 如果没用到HDFS,像上面就会是org.apache.hadoop.fs.LocalFileSystem, 然后根据此FileSystem得到File System Uri,对于上面的FileSystem是"file:///",把这个值保 存到Configuration的两个属性中(分别是"fs.default.name"和"fs.defaultFS",如果配置文件中已有,这里将会覆盖它) 接着读取"hbase.master.distributed.log.splitting"属性的值,默认distributedLogSplitting为true, 表示启用SplitLogManager,构造一个SplitLogManager实例: createInitialFileSystemLayout() checkRootDir 1. 等待fs退出安全模式(默认10秒钟轮循一次,可通过参数hbase.server.thread.wakefrequency调整 2.a. 如果hbase.rootdir目录不存在则创建它, 然后在此目录中创建名为"hbase.version"的文件,内容是文件系统版本号("7") 2.b. 如果hbase.rootdir目录已存在,则读出"hbase.version"文件的内容与当前的版本号相比, 如果不相等,则打印错误信息(提示版本不对),抛出异常FileSystemVersionException 3. 检查hbase.rootdir目录下是否有名为"hbase.id"的文件,如果没有则创建它, 内容是随机生成的UUID(总长度36位,由5部份组成,用"-"分隔),如: 6c43f934-37a2-4cae-9d49-3f5abfdc113d 4. 读出"hbase.id"的文件的内容存到clusterId字段 5. 判断hbase.rootdir目录中是否有"-ROOT-/70236052"目录,没有的话说明是第一次启动hbase,进入: 5.1 bootstrap(final Path rd, final Configuration c) 调用HRegion.createHRegion建立"-ROOT-"分区和".META."分区时,目录布局如下 E:\HBASE\DATA │ .hbase.id.crc │ .hbase.version.crc │ hbase.id │ hbase.version │ ├─-ROOT- │ └─70236052 │ │ ..regioninfo.crc │ │ .regioninfo │ │ │ ├─.logs │ │ .hlog.1329045483158.crc │ │ hlog.1329045483158 │ │ │ ├─.oldlogs │ └─info └─.META └─1028785192 │ ..regioninfo.crc │ .regioninfo │ ├─.logs │ .hlog.1329045485940.crc │ hlog.1329045485940 │ ├─.oldlogs └─info 把".META."分区信息加到"-ROOT-"表,并关闭分区和hlog时 E:\HBASE\DATA │ .hbase.id.crc │ .hbase.version.crc │ hbase.id │ hbase.version │ ├─-ROOT- //"-ROOT-"表名 │ └─70236052 //"-ROOT-"分区名 │ │ ..regioninfo.crc │ │ .regioninfo //"-ROOT-"分区描述表件 │ │ │ ├─.oldlogs │ │ .hlog.1329045483158.crc │ │ hlog.1329045483158 │ │ │ ├─.tmp │ └─info //列族名 │ .c4d7a00bb555409f9a4a8b4fbc57f1bd.crc │ c4d7a00bb555409f9a4a8b4fbc57f1bd //存放".META."分区信息的StoreFile │ └─.META └─1028785192 │ ..regioninfo.crc │ .regioninfo │ ├─.oldlogs │ .hlog.1329045485940.crc │ hlog.1329045485940 │ └─info 5.2 createRootTableInfo 建立"-ROOT-"表的描述文件 判断hbase.rootdir/-ROOT-目录中是否存在.tableinfo开头的文件 6. 创建file:/E:/hbase/data/.oldlogs目录 执行完MasterFileSystem构造函数时的目录结构如下: E:\HBASE\DATA │ .hbase.id.crc │ .hbase.version.crc │ hbase.id │ hbase.version │ ├─-ROOT- │ │ ..tableinfo.0000000001.crc │ │ .tableinfo.0000000001 │ │ │ ├─.tmp │ └─70236052 │ │ ..regioninfo.crc │ │ .regioninfo │ │ │ ├─.oldlogs │ │ .hlog.1329045483158.crc │ │ hlog.1329045483158 │ │ │ ├─.tmp │ └─info │ .c4d7a00bb555409f9a4a8b4fbc57f1bd.crc │ c4d7a00bb555409f9a4a8b4fbc57f1bd │ ├─.META │ └─1028785192 │ │ ..regioninfo.crc │ │ .regioninfo │ │ │ ├─.oldlogs │ │ .hlog.1329045485940.crc │ │ hlog.1329045485940 │ │ │ └─info └─.oldlogs