现象:
1.在HBase Shell里执行建表操作会等很久,最终失败;
2.通过代码侧进行建表同样不能成功。
原因排查:
1.查询HMaster日志,发现有接收到建表(create)的RPC请求;
在zookeeper的/hbase/table和/hbase/table-lock路径下也都能看到此table;
/hbase/table-lock/testXXXX路径下存在write**文件,表明获取table锁的过程没有问题;
2.从代码侧观察,发现建表操作的CreateTableHandler线程开始运行的话,没有info打印。说明此线程未运行。
代码样例:
public void process(){ TableName tableName = this.hTableDescriptor.getTableName(); Log.info("—————开始建表———————"); }
3.查看jstack,有DisableTable Handler一直处于sleep状态
原因:
由于HMaster上进行table-operations(create/disable)都是用的同一个线程池,并且线程池的大小为1,所以确认是DisableHandler线程一直未结束导致无法进行建表。
总结:
类似问题可以通过jstack查看具体是哪个线程运行导致当前建表操作提交了但是不能分配线程运行。
当前HBase版本处理DDL操作的线程池最大线程数都是1,所以一个操作进行时,其他操作都需要等待。建议以后版本开放此线程池的配置项,能够并发处理操作。