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

我试图自动化为使用Docker容器使用HBase的Web服务设置开发环境。 一旦容器启动并启动HBase,我想要将模式应用于HBase。

试图调用一个脚本,将模式复制到HBase并立即通过./hbase shell应用它给我一个主节点没有完成初始化的错误(我知道在容器上运行这个脚本将我留在hbase-cli提示,但我会处理自动返回,一旦我得到它在第一个地方运行)。

我已经看过像等待它的工具,但是我找不到主机/端口组合,当主节点被初始化时,它会显示为“up”。

我的问题是,我怎么能轮询我的HBase容器,以查看主节点何时初始化,所以我可以应用我的架构,而不看日志,并在容器本身手动运行命令?

首先,这是一个棘手的问题。 这是我们在拼接机(开源)的devise,希望它可以帮助…

(1)创buildMasterObserver(协处理器):这是模式创build的单个入口点。

(2)如果zookeeper没有find模式初始化标志,则从区域服务器创build调用来调用主服务器(例如,创build特定的InitTable)。

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

(4)在创build结束时,MasterObserver将一个初始化标志写入zookeeper。 这很关键,因为它处理快速反弹服务器时可能发生的部分创build情况。

代码示例:

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"); } } } 

随时检查

RegionLifecycleObserver和SpliceMasterObserver在我们的github帐户。

https://github.com/splicemachine/spliceengine

祝你好运。