级联HBase Tap

时间:2013-03-12 14:08:40

标签: hadoop hbase cascading scalding

我正在尝试编写必须连接到HBase的Scalding个作业,但我无法使用HBase tap。我尝试使用Twitter Maple后面的this example project提供的点击,但似乎我正在使用的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依赖项的硬编码版本编译的,并且很难使它们与部署的实际版本匹配。

1 个答案:

答案 0 :(得分:7)

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

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

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