【问题标题】:Hbase Java API TableNotDisabledExceptionHbase Java API TableNotDisabledException
【发布时间】:2016-08-11 09:13:30
【问题描述】:

我在本地系统上配置了 Apache hbase 0.94.14。我必须通过 java API 与 hbase 通信。我编写了简单的代码来在现有的 hbase 表中添加一个新的列族。

Java 类代码

         // Instantiating configuration class.
        Configuration conf = HBaseConfiguration.create();
        // Instantiating HBaseAdmin class.
        HBaseAdmin admin = new HBaseAdmin(conf);

        // Instantiating columnDescriptor class
        HColumnDescriptor columnDescriptor =new
        HColumnDescriptor("contactDetails");
        // Adding column family
        admin.addColumn("local_webpage", columnDescriptor);
        System.out.println("column added");

当我运行这段代码时,发生了以下异常。

16/08/11 14:07:37 INFO zookeeper.ClientCnxn: EventThread shut down
Exception in thread "main" org.apache.hadoop.hbase.TableNotDisabledException: org.apache.hadoop.hbase.TableNotDisabledException: local_webpage
    at org.apache.hadoop.hbase.master.HMaster.checkTableModifiable(HMaster.java:1525)
    at org.apache.hadoop.hbase.master.handler.TableEventHandler.<init>(TableEventHandler.java:72)
    at org.apache.hadoop.hbase.master.handler.TableAddFamilyHandler.<init>(TableAddFamilyHandler.java:41)
    at org.apache.hadoop.hbase.master.HMaster.addColumn(HMaster.java:1402)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.apache.hadoop.hbase.ipc.WritableRpcEngine$Server.call(WritableRpcEngine.java:323)
    at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1426)

    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.apache.hadoop.hbase.RemoteExceptionHandler.decodeRemoteException(RemoteExceptionHandler.java:96)
    at org.apache.hadoop.hbase.client.HBaseAdmin.addColumn(HBaseAdmin.java:1071)
    at org.apache.hadoop.hbase.client.HBaseAdmin.addColumn(HBaseAdmin.java:1054)
    at hbaseclient.HbaseClient.main(HbaseClient.java:44)
/home/user/.cache/netbeans/8.1/executor-snippets/run.xml:53: Java returned: 1

如果我通过 hbase shell 添加列族,则不会出现问题。哪里有问题。表是通过 Apache Nutch 2.3.1 创建的

【问题讨论】:

    标签: java hadoop hbase nosql


    【解决方案1】:

    您必须先禁用该表,然后才能向其添加族。

    HBaseAdmin#disableTable()...
    

    我认为这是您绕过异常的唯一问题。

    【讨论】:

    • 那么,有了hbase shell,为什么更新数据的时候不需要disable了。
    【解决方案2】:

    由于您要修改表,因此首先禁用表,然后再修改表。

    新的代码示例可能如下:

    // Instantiating configuration class.
    Configuration conf = HBaseConfiguration.create();
    // Instantiating HBaseAdmin class.
    HBaseAdmin admin = new HBaseAdmin(conf);
    // Disabling the table 
    admin.disableTable("local_webpage");
    // Instantiating columnDescriptor class with "contactDetails" as column family name
    HColumnDescriptor columnDescriptor = new HColumnDescriptor("contactDetails");
    // Adding column family
    admin.addColumnFamily("local_webpage", columnDescriptor);
    System.out.println("column family added");
    

    希望对你有帮助!!!

    【讨论】:

    • 如果我通过 hbase shell 修改表没有问题。那为什么java api有问题
    • @Shafiq:当通过 hbase shell 修改时,还需要禁用。即使我们截断表格,也需要禁用。我不知道为什么在你的情况下不需要它??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2016-12-10
    相关资源
    最近更新 更多