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

在HBase主Docker容器完成初始化时自动运行脚本,docker,hbase,docker-compose,Docker,Hbase,Docker Compose,我正在尝试使用Docker容器为使用HBase的web服务自动设置开发环境。我想做的是在容器启动并启动HBase后,将我们的模式应用于HBase 尝试调用将架构复制到HBase的脚本,并通过/HBase shell立即应用该脚本时,会出现主节点未完成初始化的错误(我知道在容器上运行该命令会让我在hbase cli提示符下运行,但我会在一开始运行该命令后处理自动返回的问题) 我已经看过类似的工具,但是我找不到一个主机/端口组合,当主节点初始化时,它会显示为“启动” 我的问题是,我如何轮询我的HBa

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

尝试调用将架构复制到HBase的脚本,并通过
/HBase shell
立即应用该脚本时,会出现主节点未完成初始化的错误(我知道在容器上运行该命令会让我在hbase cli提示符下运行,但我会在一开始运行该命令后处理自动返回的问题)

我已经看过类似的工具,但是我找不到一个主机/端口组合,当主节点初始化时,它会显示为“启动”


我的问题是,我如何轮询我的HBase容器以查看主节点何时初始化,这样我就可以在不查看日志和在容器中手动运行命令的情况下应用我的模式?

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

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

(2) 如果zookeeper没有找到schema initialized标志,则在区域服务器调用主服务器时创建来自它们的调用(例如创建特定的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");
            }
        }
    }
@覆盖
public void precreateable(ObserverContext ctx、HTableDescriptor desc、HRegionInfo[]区域)引发IOException{
拼接Logutils.info(日志,“预创建表%s”,字节数.toString(desc.getTableName().getName());
if(Bytes.equals(desc.getTableName().getName(),INIT_TABLE)){
开关(manager.getState()){
未启动的案例:
boot();
案例引导引擎:
案例引导\u一般\u服务:
案例引导服务器:
抛出新的PleaseHoldException(“请保持启动”);
案件审理:
抛出新的DonotretryoException(“成功”);
案例启动失败:
案例关闭(u):
案例关闭:
抛出新的非法状态异常(“启动失败”);
}
}
}
请随意退房

在我们的github帐户上注册LifecycleObserver和MasterObserver


祝你好运。

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

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

(2) 如果zookeeper没有找到schema initialized标志,则在区域服务器调用主服务器时创建来自它们的调用(例如创建特定的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");
            }
        }
    }
@覆盖
public void precreateable(ObserverContext ctx、HTableDescriptor desc、HRegionInfo[]区域)引发IOException{
拼接Logutils.info(日志,“预创建表%s”,字节数.toString(desc.getTableName().getName());
if(Bytes.equals(desc.getTableName().getName(),INIT_TABLE)){
开关(manager.getState()){
未启动的案例:
boot();
案例引导引擎:
案例引导\u一般\u服务:
案例引导服务器:
抛出新的PleaseHoldException(“请保持启动”);
案件审理:
抛出新的DonotretryoException(“成功”);
案例启动失败:
案例关闭(u):
案例关闭:
抛出新的非法状态异常(“启动失败”);
}
}
}
请随意退房

在我们的github帐户上注册LifecycleObserver和MasterObserver


祝你好运。

用脚本检查hbase日志的最后100行,直到日志
master.HMaster:master已完成初始化
出现。这个问题有答案吗?我遇到了同样的问题没有,对不起。我想我发现了其他一些黑客,但我记不起来了,我已经换了工作。我也离开了我终于有了一个可靠的环境构建工作。用脚本检查hbase日志的最后100行,直到日志
master.HMaster:master完成了初始化
出现为止。这个问题有答案吗?我遇到了同样的问题Nope,抱歉。我想我找到了其他一些漏洞,但我找不到记住,我已经换了工作。在我最终获得一个可靠的环境构建工作时,我也离开了那个项目。