2016-08-17 89 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

好運。