2016-08-17 90 views
1

我试图自动为使用Docker容器的HBase设置Web服务的开发环境。当容器启动并启动HBase时,我想要将我们的模式应用于HBase。当HBase主Docker容器完成初始化时自动运行脚本

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

我已经看过像wait-for-it这样的工具,但是我找不到主机/端口组合命中,当主节点初始化时会显示为“up”。

我的问题是,我该如何查询我的HBase的容器看到当主节点被初始化,所以我能将我的模式,而不在容器本身看日志,并手动运行命令?

+0

怎么样一个脚本来检查的最后100行HBase的日志,直到日志'''master.HMaster:出现主已完成initialization'''? –

回答

0

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

(1)创建一个MasterObserver(协处理器):这是一个条目模式创建的一个点。

(2)创建一个从区域服务器的呼叫,他们拿出来调用主机(例如创建特定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"); 
      } 
     } 
    } 

随时检查出

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

https://github.com/splicemachine/spliceengine

好运。