当HBase主Docker容器完成初始化时自动运行脚本

时间:2016-08-17 21:13:42

标签: docker hbase docker-compose

我尝试使用Docker容器为使用HBase的Web服务自动设置开发环境。我想做的是在容器启动并启动HBase后将我们的架构应用于HBase。

尝试调用将架构复制到HBase并立即通过./hbase shell应用它的脚本给我一个错误,主节点没有完成初始化(我知道在容器上运行它会离开我在hbase-cli提示符下,但是一旦我开始运行它,我就会自动返回。)

我已经查看了wait-for-it之类的工具,但我找不到要点击的主机/端口组合,以显示为" up"初始化主节点时。

我的问题是,如何轮询我的HBase容器以查看何时初始化主节点,以便我可以在不查看日志的情况下应用我的架构并在容器本身中手动运行命令?

1 个答案:

答案 0 :(得分:0)

首先,这是一个棘手的问题。这是我们在Splice Machine(开源)的设计,希望它有所帮助...

(1)创建MasterObserver(协处理器):这是模式创建的单一入口点。

(2)如果zookeeper没有找到架构初始化标志,则在区域服务器调用master(例如Create Specific InitTable)时创建调用。

(3)让MasterObserver覆盖preCreateTable并以线程阻塞方式在那里执行模式创建(即阻止来自区域服务器的其他请求)。在我们的字典初始化(模式)之前,我们不希望我们的JDBC / ODBC端口,并且我们还希望确保我们有一个区域服务器可用于创建的表。

(4)在创建结束时,让MasterObserver向zookeeper写一个初始化标志。这很关键,因为它处理在快速弹出服务器时可能发生的部分创建案例等。

代码示例:

MasterObserver代码段

@Override
    public void preCreateTable(ObserverContext<MasterCoprocessorEnvironment> ctx, HTableDescriptor desc, HRegionInfo[] regions) throws IOException {
        SpliceLogUtils.info(LOG, "preCreateTable %s", Bytes.toString(desc.getTableName().getName()));
        if (Bytes.equals(desc.getTableName().getName(), INIT_TABLE)) {
            switch(manager.getState()){
                case NOT_STARTED:
                    boot();
                case BOOTING_ENGINE:
                case BOOTING_GENERAL_SERVICES:
                case BOOTING_SERVER:
                    throw new PleaseHoldException("Please Hold - Starting");
                case RUNNING:
                    throw new DoNotRetryIOException("Success");
                case STARTUP_FAILED:
                case SHUTTING_DOWN:
                case SHUTDOWN:
                    throw new IllegalStateException("Startup failed");
            }
        }
    }

随意查看

我们的github帐户上的RegionLifecycleObserver和SpliceMasterObserver。

https://github.com/splicemachine/spliceengine

祝你好运。