2013-03-12 63 views
4

我想寫Scalding作業必須連接到HBase,但我有麻煩使用HBase水龍頭。我試過使用Twitter Maple提供的tap,在this example project之後,但似乎我使用的Hadoop/HBase版本與Twitter用作客戶端的版本不兼容。級聯HBase水龍頭

我的羣集正在使用HBase 0.92和Hadoop 2.0.0-cdh4.1.3運行Cloudera CDH4。每當我啓動連接到HBase的滾燙的工作,我得到的異常

java.lang.NoSuchMethodError: org.apache.hadoop.net.NetUtils.getInputStream(Ljava/net/Socket;)Ljava/io/InputStream; 
    at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.setupIOstreams(HBaseClient.java:363) 
    at org.apache.hadoop.hbase.ipc.HBaseClient.getConnection(HBaseClient.java:1046) 
... 

看來,由Twitter楓使用HBase的客戶期待在NetUtils一些方法不上部署我的羣集的版本的Hadoop的存在。

我該如何追蹤究竟是什麼不匹配 - HBase客戶端期望的版本等等?總體來說,有沒有辦法來緩解這些問題?

在我看來,經常客戶端庫編譯與Hadoop依賴關係的硬編碼版本,很難使那些匹配的實際版本部署。

回答

7

該方法實際存在但已更改其簽名。基本上,它歸結爲您的客戶端和服務器上有不同版本的Hadoop庫。如果您的服務器運行Cloudera,則應使用Cloudera提供的HBase和Hadoop庫。如果您使用的是Maven,則可以使用Cloudera's Maven repository

似乎在Build.scala中處理庫依賴關係。我還沒有使用Scala,所以我不完全確定如何修復它。

打破兼容性的更改已作爲HADOOP-8350的一部分提交。看看Ted Yu的評論和迴應。他在HBase上工作並有同樣的問題。根據他的評論,最新版本的HBase庫應該自動處理這個問題。

+0

謝謝,我懷疑這一點。問題是HBase客戶端版本在Twitter Maple tap中硬編碼。所以基本上我唯一的機會是用Richt依賴項編譯自己的Twitter楓樹集合?或者有更簡單的方法來使它工作? – Andrea 2013-03-29 08:13:53

+0

如果您使用的是Maven,您可以[覆蓋依賴關係](http://stackoverflow.com/questions/3937195/maven-how-to-override-the-dependency-added-by-a-library)。在最壞的情況下,只需構建JAR並將類路徑指向正確版本的HBase。 – kichik 2013-03-30 01:40:43

+2

面對這個問題與hadoop 0.23.7,但尋找來源 - 在0.23.1找到正確的簽名(全文:http://www.yetanothercoder.ru/2013/05/2-days-of-integration-of- OSGi的hadoop.html) – yetanothercoder 2013-05-28 16:05:23