2016-09-12 91 views
2

我遇到了使用Java API截斷HBase表的意外行爲。具體而言,我做以下操作:HBase:通過Java API截斷表使表被截斷

  1. 禁用表
  2. 截斷表
  3. 啓用表

對應於這些操作的代碼如下:

Configuration conf = HBaseConfiguration.create(); 
// ... 
// Setting properly the configuration information 
// ... 
try (HBaseAdmin admin = new HBaseAdmin(conf)) { 
    if (admin.isTableEnabled(TABLE_NAME)) { 
     admin.disableTable(TABLE_NAME); 
    } 
    admin.truncateTable(TableName.valueOf(TABLE_NAME), false); 
    // Enabling the table after having truncated 
    admin.enableTable(TABLE_NAME); 
} catch (MasterNotRunningException e) { 
    e.printStackTrace(); 
} catch (ZooKeeperConnectionException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

現在,截斷操作之後的語句admin.enableTable(TABLE_NAME)將拋出一個org.apache.hadoop.hbase.TableNotDisabledException。這是對的嗎?通過Java API截斷表重新啓用它自動?

我檢查了API,但沒有找到任何對此行爲的參考。

我正在使用HBase,版本1.0.0-cdh5.5.0。

回答

2

HBASE截斷需要執行3個操作:

  1. 禁止表,如果它已經呈現(因爲它滴在第二動作表,其需要被禁用第一)
  2. 降價表,如果它已經呈現
  3. 重新創建提到的表(任何創建都將自動啓用表)

與hbase-shell tr​​uncate命令相同的行爲。 shell和java api之間的唯一區別是shell自動執行所有操作,但在java api中,需要首先顯式禁用表以實現第二次刪除操作,並且上次操作再次創建它,因此默認情況下啓用了新表。

希望這個解釋...