HBase:通过Java API截断表使表截断

时间:2016-09-12 12:47:07

标签: java hadoop hbase

我遇到了使用Java API截断HBase表的意外行为。详细说明,我正在进行以下操作:

  1. 禁用表格
  2. 截断表格
  3. 启用表格
  4. 与这些操作对应的代码如下:

     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。

1 个答案:

答案 0 :(得分:2)

Hbase truncate需要执行3次操作:

  1. 如果表已经存在,则禁用该表(因为它在第二个操作中删除表,需要先被禁用)
  2. 丢弃表格(如果已经存在)
  3. 重新创建提到的表格(任何创建将自动启用该表格)
  4. 与hbase-shell tr​​uncate命令相同。 shell和java api之间的唯一区别是shell自动执行all,但是在java api中,需要首先显式禁用表以实现第二次删除操作,最后一次操作再次创建它,因此默认情况下启用新表。

    希望这能解释......