4

我正在尝试编写必须连接到 HBase 的烫伤作业,但我在使用 HBase 水龙头时遇到了麻烦。我已经尝试使用Twitter Maple提供的水龙头,遵循这个示例项目,但我使用的 Hadoop/HBase 版本与 Twitter 用作客户端的版本之间似乎存在一些不兼容。

我的集群使用 HBase 0.92 和 Hadoop 2.0.0-cdh4.1.3运行Cloudera CDH4。每当我启动连接到 HBase 的 Scalding 作业时,都会出现异常

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 Maple 使用的 HBase 客户端似乎期望NetUtils在我的集群上部署的 Hadoop 版本上不存在某些方法。

我如何追踪到底是什么不匹配——HBase 客户端期望什么版本等等?一般来说,有没有办法缓解这些问题?

在我看来,客户端库通常是用硬编码版本的 Hadoop 依赖项编译的,很难使它们与部署的实际版本相匹配。

4

1 回答 1

7

该方法确实存在,但已更改其签名。基本上,它归结为在您的客户端和服务器上拥有不同版本的 Hadoop 库。如果您的服务器运行 Cloudera,您应该使用 Cloudera 的 HBase 和 Hadoop 库。如果您使用的是 Maven,则可以使用Cloudera 的 Maven 存储库

似乎库依赖项是在 Build.scala 中处理的。我还没有使用过 Scala,所以我不完全确定如何在那里修复它。

破坏兼容性的更改是作为HADOOP-8350的一部分提交的。看看 Ted Yu 的评论和回复。他在 HBase 上工作并且遇到了同样的问题。根据他的评论,更高版本的 HBase 库应该会自动处理这个问题。

于 2013-03-29T00:46:42.057 回答