一、相关背景
在HBase里、类似于传统关系型数据库的DDL操作的RPC请求差不多都是由HBase里面的HMaster执行的。当RPC请求发送到HMaster所在的节点之后,由MasterRpcServices调用HMaster里面对应的方法进行处理。
在HMaster中,通过调用ExecutorService里面的submit方法,将相关处理线程(EventHandler)提交给线程池处理。其中处理创建表的线程就是上面的CreateTableHandler。上面的prepare方法主要可以用于一些基本的检测,而process方法则是处理相关逻辑的方法。
二、create过程
create的过程主要是process方法通过调用handleCreateTable来实现,具体过程代码中也有非常详细的注释。主要就是创建相关的目录结构,然后更新hbase:meta表里面的相关信息,接着随机分配预定义的分区(当然要创建者指定了相关的分区),还有添加相关副本以及zookeeper里面的信息,最后还要更新HMaster里面的相关表缓存。
三、disable过程
disable过程主要是通过DisableTableHandler来完成的,比如这里面的prepare过程就会检查要disable的不是hbase:meta表。而disable过程主要是通过handleDisableTable来完成的,在hbase.bulk.assignment.waiton.empty.rit(默认五分钟)内,必须通过HMaster的assignmentManager来负责将所有的region进行批量unassign操作,否则就超时了。当然还需要更新zookeeper里面的信息。
四、enable过程
enable过程主要是通过EnableTableHandler类来完成。首先要获取相对应的region信息,如果是meta表,则直接通过构造方法来构造相应的locator(八成是启动时要enable meta表吧,以后再再细看);如果是别的表则通过meta表来获取相应的位置信息。还会考虑replica相关的东西(这个以后有机会再单独介绍),最后根据所有的regionserver执行批量分配所有的region。当然整个过程也会涉及zookeeper信息的更新。这个批量分配过程也是按照hbase.bulk.assignment.waiton.empty.rit为超时时间的。也可以根据hbase.bulk.assignment.threadpool.size来控制批量分配的线程数(默认20个)。
五、drop过程
drop过程主要通过DeleteTableHandler类来完成。drop以及增加列族这类操作比较特别、比如需要上锁等等,因此所有相关handler都继承自TableEventHandler,并在父类中通过masterService进行上锁操作。在具体的处理逻辑中,首先会考虑到region可能正在处于transition过程,所以需要等待一段时间(超过hbase.master.wait.on.region则视为超时),接着删除hbase:meta以及HDFS中的数据,然后就是删除一些缓存信息,例如HMaster中关于表的缓存、region缓存,最后还会调用cleanAnyRemainingRows();方法确认hbase:meta表里面的所有信息完全删除。当然有上锁操作就会有解锁操作,父类TableEventHandler的finally块中会release相关的锁。
六、总结
以上博客都是关于HBase社区1.0.0版的个人总结,如有不足之处欢迎指正。