使用Java连接到远程HBase服务

我有一个小示例代码,我尝试建立与远程HBase实体的连接。 代码在没有安装HBase的Windows机器上运行,我尝试连接到安装并运行它的远程Ubuntu服务器。 以下代码段中的IP当然只是一个占位符。

代码如下:

public static void main(String[] args) { Configuration conf = HBaseConfiguration.create(); HBaseAdmin admin = null; String ip = "10.10.10.10"; String port = "2181"; conf.set("hbase.zookeeper.quorum", ip); conf.set("hbase.zookeeper.property.clientPort", port); try { admin = new HBaseAdmin(conf); boolean bool = admin.tableExists("sensor_data"); System.out.println("Table exists? " + bool); } catch (IOException e) { e.printStackTrace(); } } 

但由于某种原因,我收到此错误:

 org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator at org.apache.hadoop.hbase.client.RpcRetryingCaller.translateException(RpcRetryingCaller.java:229) at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:202) at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:320) at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:295) at org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:160) at org.apache.hadoop.hbase.client.ClientScanner.(ClientScanner.java:155) at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:811) at org.apache.hadoop.hbase.MetaTableAccessor.fullScan(MetaTableAccessor.java:602) at org.apache.hadoop.hbase.MetaTableAccessor.tableExists(MetaTableAccessor.java:366) at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:303) at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:313) at com.twoBM.Tests.HBaseWriter.main(HBaseWriter.java:26) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) Caused by: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator at org.apache.hadoop.hbase.zookeeper.MetaTableLocator.blockUntilAvailable(MetaTableLocator.java:596) at org.apache.hadoop.hbase.zookeeper.MetaTableLocator.blockUntilAvailable(MetaTableLocator.java:580) at org.apache.hadoop.hbase.zookeeper.MetaTableLocator.blockUntilAvailable(MetaTableLocator.java:559) at org.apache.hadoop.hbase.client.ZooKeeperRegistry.getMetaRegionLocation(ZooKeeperRegistry.java:61) at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateMeta(ConnectionManager.java:1185) at org.apache.hadoop.hbase.client.ConnectionManager$HConnectionImplementation.locateRegion(ConnectionManager.java:1152) at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.getRegionLocations(RpcRetryingCallerWithReadReplicas.java:300) at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:153) at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:61) at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithoutRetries(RpcRetryingCaller.java:200) ... 15 more 

我正在使用Gradle来构建我的项目,目前我只使用以下两个依赖项:

 compile 'org.apache.hive:hive-jdbc:2.1.0' compile 'org.apache.hbase:hbase:1.1.6' 

有谁知道解决这个问题? 我试过谷歌搜索这个问题,但没有找到任何提供实际解决方案的链接。

最好的祝福

这肯定是谷歌番石榴的依赖冲突。 自Guava v.17以来, Stopwatch类的默认构造函数变为私有,甚至更早被标记为已弃用。

因此,要使HBase Java客户端正常工作,您需要Guava v.16或更早版本。 检查构建应用程序的方式(Maven / Gradle / Classpath)并找到使用Guava v.17 +的依赖项。 之后,您可以解决冲突。

您可以使用maven shade插件来解决此问题。 看看这篇博文 。 这是一个例子(实际上是我工作的pom的一个片段。)

   org.apache.maven.plugins maven-shade-plugin 3.0.0   assemble-all package  shade      com.google.common shaded.com.google.common   com.google.protobuf shaded.com.google.protobuf     *:*