2016-08-11 3 views
2

로컬 시스템에 Apache hbase 0.94.14를 구성했습니다. Java API를 통해 hbase와 통신해야합니다. 기존의 hbase 테이블에 새로운 열 패밀리를 추가하는 간단한 코드를 작성했습니다. 자바 클래스에 대한Hbase Java API TableNotDisabledException

코드

  // 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 셸을 통해 열 패밀리를 추가해도 문제가 발생하지 않습니다. 문제가 어디입니까? 테이블은 Apache Nutch를 통해 생성됩니다. 2.3.1

답변

0

패밀리를 추가하려면 먼저 테이블을 비활성화해야합니다.

HBaseAdmin#disableTable()... 

나는이 예외를 극복하는 유일한 문제라고 생각합니다.

+0

그런 다음 hbase 셸을 사용하면 데이터를 업데이트 할 때 비활성화 할 필요가 없습니다. – Shafiq

0

테이블을 수정하기 때문에 먼저 테이블을 비활성화 한 다음 테이블을 수정하십시오.

새로운 코드 샘플은 다음과 같이 할 수있다 :이 도움을 희망

// 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"); 

!

+0

hbase 쉘을 통해 테이블을 수정해도 아무런 문제가 없습니다. 그렇다면 왜 자바 API에 문제가 있습니까? – Shafiq

+0

@Shafiq : hbase 쉘을 통해 수정하면 비활성화가 필요합니다. 우리가 테이블을자를 때도 사용 안함이 필요합니다. 나는 왜 당신의 경우에는 그것이 필요하지 않은지 ?? – Farooque