2016-05-09 30 views
1

與此鏈接https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration#HBaseIntegration-HiveMAPtoHBaseColumnFamily蜂房HBase的整合拋出ClassNotFoundException的NULL ::字符改變

我試圖整合蜂巢和HBase的經過,我在蜂房site.xml中這種配置:

<property> 
    <name>hive.aux.jars.path</name> 
    <value> 
    file:///$HIVE_HOME/lib/hive-hbase-handler-2.0.0.jar, 
    file:///$HIVE_HOME/lib/hive-ant-2.0.0.jar, 
    file:///$HIVE_HOME/lib/protobuf-java-2.5.0.jar, 
    file:///$HIVE_HOME/lib/hbase-client-1.1.1.jar, 
    file:///$HIVE_HOME/lib/hbase-common-1.1.1.jar, 
    file:///$HIVE_HOME/lib/zookeeper-3.4.6.jar, 
    file:///$HIVE_HOME/lib/guava-14.0.1.jar 
    </value> 
</property> 
在HBase的:

然後創建一個名爲 'TestTable的TS':表

hbase> create 'ts:testTable','pokes' 
hbase> put 'ts:testTable', '10000', 'pokes:value','val_10000' 
hbase> put 'ts:testTable', '10001', 'pokes:value','val_10001' 
... 

hbase> scan 'ts:testTable' 
ROW      COLUMN+CELL 
10000     column=pokes:value, timestamp=1462782972084, value=val_10000 
10001     column=pokes:value, timestamp=1462783514212, value=val_10001 
.... 

然後在蜂巢創建外部表:

Hive> CREATE EXTERNAL TABLE hbase_test_table(key int, value string) 
     STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
     WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, pokes:value") 
     TBLPROPERTIES ("hbase.table.name" = "ts:testTable", 
     "hbase.mapred.output.outputtable" = "ts:testTable"); 

到目前爲止好。但是當我試圖從測試表中選擇數據時,引發了異常:

Hive> select * from hbase_test_table; 
FAILED: RuntimeException java.lang.ClassNotFoundException: NULL::character varying 
Error: Error while compiling statement: FAILED: RuntimeException java.lang.ClassNotFoundException: NULL::character varying (state=42000,code=40000) 

我是否缺少任何東西?

我想蜂巢2.0.0與1.2.1的HBase

回答

1

好了的時候,我想通了,在「空::字符改變」不是蜂巢的一部分,它是從PostgreSQL的到來,因爲我使用它作爲Metastore的後端。但問題是Hive不能識別來自Postgresql的這個異常。我們對Hive 2.0.0有以下代碼:

300: if (inputFormatClass == null) { 
301: try { 
302:  String className = tTable.getSd().getInputFormat(); 
303:  if (className == null) { 
304:  if (getStorageHandler() == null) { 
305:   return null; 
306:  } 
307:  inputFormatClass = getStorageHandler().getInputFormatClass(); 
308: } else { 
309: inputFormatClass = (Class<? extends InputFormat>) 
310: Class.forName(className, true, Utilities.getSessionSpecifiedClassLoader()); 
    } 

行302不會返回應該爲null的行。所以310行會嘗試加載一個不存在的類。這就是程序失敗的原因。

我認爲這是一個兼容的錯誤,修復它的方法是改變我討厭的數據庫。所以,我只是簡單地更換302

if (className == null || className.toLowerCase().startsWith("null::")) { 

,做同樣的事情到getOutputFormat()方法,然後重新編譯罐子,就是這樣。