户的权限并记录。
3. 获取table write锁
4. 检查表是否存在,已存在则抛出异常
5. 为了防止多个线程发起建同一个表的情况,可以在建表未成功之前可以先设置该table enable,这样其他线程就不能再建表。
建表之前的准备工作到此结束,一下分析具体建表流程
2.2 建表具体实现handleCreateTable过程分析
handleCreateTable,其实主要做了三件事,1.在磁盘上建表,2.meta表,3.为新建的表分配对应的regionserver。详细代码如下:
这块的代码是分为八个小步骤,我们一一分析,
1.创建表描述符
// 1. Create Table Descriptor Path tempTableDir = FSUtils.getTableDir(tempdir, tableName); new FSTableDescriptors(this.conf).createTableDescriptorForTableDirectory( tempTableDir, this.hTableDescriptor, false); Path tableDir = FSUtils.getTableDir(fileSystemManager.getRootDir(), tableName);
首先创建一个临时的文件夹,然后创建对应的文件表描述符,最后创建该表在文件系统中的路径,
HBase的表的数据对应在文件系统中的一个文件夹下,该文件夹也就是表名
2.创建Regions
// 2. Create Regions List
regionInfos = handleCreateHdfsRegions(tempdir, tableName);
为table 创建in-disk数据结构,内部具体创建了存储table数据的HRegion,并返回hregioninfo的信息
3.将步骤1中的临时文件夹移到HBase的根目录下,如果hregions创建成功的话,继续一下几个步骤:
if (regionInfos != null && regionInfos.size() > 0) { // 4. Add regions to META addRegionsToMeta(regionInfos); // 5. Add replicas if needed regionInfos = addReplicas(hTableDescriptor, regionInfos); // 6. Trigger immediate assignment of the regions in round-robin fashion ModifyRegionUtils.assignRegions(assignmentManager, regionInfos); }
将新建的hregion信息注册到hbase的meta表中; 有必要的话创建这些hregion的副本 为新建的hregions分配对应的regionserver 在zookeeper中将新建的table设置为enable状态:
// 7. Set table enabled flag up in zk. try { assignmentManager.getTableStateManager().setTableState(tableName, ZooKeeperProtos.Table.State.ENABLED); } catch (CoordinatedStateException e) { throw new IOException("Unable to ensure that " + tableName + " will be" + " enabled because of a ZooKeeper issue", e); }
8.跟新tabledescripter cache
// 8. Update the tabledescriptor cache. ((HMaster) this.server).getTableDescriptors().get(tableName);
至此服务器端数据库表的建立过程源码分析结束