使用Java连接远程HBase服务

5

我有一小段示例代码,其中尝试建立到远程HBase实体的连接。该代码在未安装HBase的Windows机器上运行,我尝试连接到已安装和运行HBase的远程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.<init>()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.<init>(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.<init>()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'

有没有人知道如何解决这个问题?我已经尝试通过谷歌搜索来解决它,但是我找到的链接都没有提供实际的解决方案。

最好的问候


2
你正在运行哪个版本的Hadoop?这听起来像是这里描述的相同依赖冲突:http://stackoverflow.com/q/31547463/3009 - highlycaffeinated
我不是完全确定,但我相信它是2.7.2版本。不过还是谢谢你提供链接!:D - Zeliax
为什么hadoop版本很重要?我们谈论的是hbase版本(集群中的版本与客户端应用程序使用的版本);zookeeper版本也可能是[次要]关注点。对于依赖冲突,高度咖啡因的意见得到+1支持。 - patrungel
你也可以尝试运行不同版本的hbase客户端jar文件。 问题主要出在1.1.1版本上。 https://mvnrepository.com/artifact/org.apache.hbase/hbase-client。 - Jacob Joy
3个回答

10

这绝对是因为 Google Guava 的依赖冲突。自Guava v.17以来,Stopwatch类的默认构造函数就变成了私有的,并且早在此之前就被标记为弃用。

所以,为了让HBase Java客户端正常工作,你需要使用Guava v.16或更早版本。检查你构建应用程序的方式(Maven/Gradle/Classpath),找出使用了Guava v.17+的依赖项。然后,你就可以解决这个冲突了。


这是否意味着我需要找到使用guava v.17+的Hbase依赖项,还是只需要下载guava v.17+作为独立包? - Zeliax
你是如何构建你的应用程序的?如果你使用Maven或Gradle,那么你会添加任何依赖项。其中一个是HBase,默认使用Guava v.12。很可能你还添加了另一个依赖项,它使用Guava v.17+。因此,你应该对你的依赖项做些什么,以更改Guava的版本为<= v.16。例如,你可以删除不必要的依赖项或强制更改Guava的版本。 - maxteneff
我正在使用Gradle构建我的应用程序。是否有可能从包含它的软件包中排除Guava依赖项? - Zeliax
也许这个答案可以帮到你:https://dev59.com/YV0a5IYBdhLWcg3wFlRG - maxteneff
我尝试使用您提供的链接,但是据我所知,只有我的一个依赖项使用了guava,那就是hbase v 1.2.3。它使用的是guava v. 12.0.1 <guava.version>12.0.1</guava.version>。即使使用您提供的链接中的方法,它也不起作用 :( - Zeliax
谢谢,这对我很有帮助!它对我起作用了,我将我的Guava从21降级到16。我的用途是为Kafka/HBase连接器。 - kulssaka

0

我曾遇到相同的错误,花了5天时间才找出问题所在。 我添加了以下依赖项,问题就解决了。

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>15.0</version>
</dependency>

-1

您可以使用Maven Shade插件来解决此问题。请查看博客文章。这里是一个示例(实际上是我工作中的pom文件片段)。

  <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <id>assemble-all</id>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <!--<finalName>PROJECT_NAME-${project.version}-shaded</finalName>-->
                        <relocations>
                            <relocation>
                                <pattern>com.google.common</pattern>
                                <shadedPattern>shaded.com.google.common</shadedPattern>
                            </relocation>
                            <relocation>
                                <pattern>com.google.protobuf</pattern>
                                <shadedPattern>shaded.com.google.protobuf</shadedPattern>
                            </relocation>
                        </relocations>
                        <artifactSet>
                            <includes>
                                <include>*:*</include>
                            </includes>
                        </artifactSet>
                    </configuration>
                </execution>
            </executions>
        </plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接