2013-03-12 60 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