복붙노트

[HADOOP] 자바를 사용하여 원격 HBase 서비스에 연결하기

HADOOP

자바를 사용하여 원격 HBase 서비스에 연결하기

원격 HBase 엔터티에 대한 연결을 설정하려고하는 작은 샘플 코드가 있습니다. 이 코드는 HBase가 설치되지 않은 Windows 컴퓨터에서 실행되며 설치되어 실행중인 원격 우분투 서버에 연결을 시도합니다. 아래 스 니펫의 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'

누구든지이 문제를 해결할 것을 알고 있습니까? 나는이 문제에 대한 인터넷 검색을 시도했지만 실제 링크를 제공하는 링크는 발견되지 않았다.

친애하는

해결법

  1. ==============================

    1.확실히 Google 구아바의 의존성 충돌입니다. Stopwatch 클래스의 기본 생성자는 Guava v.17부터 비공개가되었으며 훨씬 더 일찍 더 이상 사용되지 않습니다.

    확실히 Google 구아바의 의존성 충돌입니다. Stopwatch 클래스의 기본 생성자는 Guava v.17부터 비공개가되었으며 훨씬 더 일찍 더 이상 사용되지 않습니다.

    HBase Java 클라이언트에 제대로 작동하려면 Guava v.16 이하가 필요합니다. 애플리케이션 빌드 방법 (Maven / Gradle / Classpath)을 확인하고 Guava v.17 +을 사용하는 종속성을 찾으십시오. 그 후에 충돌을 해결할 수 있습니다.

  2. ==============================

    2.Maven 음영 플러그인을 사용하여이 문제를 해결할 수 있습니다. 이 블로그 게시물을 한 번보세요. 여기에 예제가있다. (실제로는 작업중인 pom의 스 니펫이다.)

    Maven 음영 플러그인을 사용하여이 문제를 해결할 수 있습니다. 이 블로그 게시물을 한 번보세요. 여기에 예제가있다. (실제로는 작업중인 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>
    
  3. from https://stackoverflow.com/questions/39725234/connecting-to-remote-hbase-service-using-java by cc-by-sa and MIT license