복붙노트

[HADOOP] Java JDBC를 통해 하이브 연결

HADOOP

Java JDBC를 통해 하이브 연결

여기에서 질문은 자바에서 하이브로 연결되지만 내 것은 다릅니다.

내 하이브는 machine1에서 실행 중이고 machine2에서 실행중인 Java 서버를 사용하여 쿼리를 전달해야합니다. 하이브가 원격 쿼리를 수신 할 목적으로 JDBC 인터페이스를 가지고 있다는 것을 이해합니다. 여기에서 코드를 가져 왔습니다. - HiveServer2 클라이언트

이 기사에 쓰여진 의존성을 설치했다.

그러나 컴파일 타임에 java.lang.NoClassDefFoundError 오류가 발생했습니다. 전체 오류 :

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
    at org.apache.hive.jdbc.HiveConnection.createBinaryTransport(HiveConnection.java:393)
    at org.apache.hive.jdbc.HiveConnection.openTransport(HiveConnection.java:187)
    at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:163)
    at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:105)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:215)
    at com.bidstalk.tools.RawLogsQuerySystem.HiveJdbcClient.main(HiveJdbcClient.java:25)

StackOverflow에서 Maven에 Hadoop API 의존성을 추가하는 것이 좋습니다. Hive Error

하이브와 연결하기 위해 클라이언트가 필요로하는 API가 왜 필요한지 이해할 수 없습니다. JDBC 드라이버가 기본 쿼리 시스템에 대해 불가지론 받아야하지 않습니까? 난 그냥 일부 SQL 쿼리를 전달해야합니까?

편집하다: Cloudera (5.3.1)를 사용하고 있는데 CDH 종속성을 추가해야한다고 생각합니다. Cloudera 인스턴스가 hadoop 2.5.0 및 HiveServer2를 실행 중입니다.

그러나 서버는 컴퓨터 1에 있습니다. 컴퓨터에서 코드는 최소한 컴파일해야하며 런타임에만 문제가 발생해야합니다.

해결법

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

    1.당신이 아직이 문제를 해결하지 못했다면, 나는 그것을 풀어 줬다. 컴파일 및 실행을 위해서는 다음과 같은 종속성이 필요했습니다.

    당신이 아직이 문제를 해결하지 못했다면, 나는 그것을 풀어 줬다. 컴파일 및 실행을 위해서는 다음과 같은 종속성이 필요했습니다.

    libthrift-0.9.0-cdh5-2.jar
    httpclient-4.2.5.jar
    httpcore-4.2.5.jar
    commons-logging-1.1.3.jar
    hive-common.jar
    slf4j-api-1.7.5.jar
    hive-metastore.jar
    hive-service.jar
    hadoop-common.jar
    hive-jdbc.jar
    guava-11.0.2.jar
    

    하이브 문서는 아마도 이전 버전 / 배포본에 대해 작성되었습니다.

    org.apache.hadoop.conf.Configuration을 가진 hadoop-common jar가 누락되어 예외가 발생했습니다.

    희망이 도움이됩니다.

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

    2.하이브 0.13에 대해 hive-jdbc 1.2.1을 사용하려고 할 때 같은 오류가 발생합니다. 다른 답변의 긴 목록과 비교합니다. 이제 우리는이 두 가지를 사용합니다 :

    하이브 0.13에 대해 hive-jdbc 1.2.1을 사용하려고 할 때 같은 오류가 발생합니다. 다른 답변의 긴 목록과 비교합니다. 이제 우리는이 두 가지를 사용합니다 :

    hive-jdbc-1.2.1-standalone.jar
    hadoop-common-2.7.1.jar
    

    또 다른 부수적 인 메모 : '필수 입력란'client_protocol '이 설정되지 않았습니다.' 이전의 하이브에 대해 최신 jdbc를 사용할 때. 그렇다면 jdbc 버전을 1.1.0으로 변경하십시오.

    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-jdbc</artifactId>
      <version>1.1.0</version>
      <classifier>standalone</classifier>
    </dependency>
    
  3. ==============================

    3.내 자신의 질문에 대답!

    내 자신의 질문에 대답!

    몇몇 히트와 트라이얼에서는 pom 파일에 다음과 같은 의존성을 추가했으며 그 이후로 CHD 5.3.1과 5.2.1 클러스터에서 코드를 실행할 수있게되었습니다.

    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>0.13.1-cdh5.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.thrift</groupId>
        <artifactId>libthrift</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.thrift</groupId>
        <artifactId>libfb303</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-core</artifactId>
        <version>2.5.0-mr1-cdh5.3.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.5.0-cdh5.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>0.13.1-cdh5.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.5.0-cdh5.3.1</version>
    </dependency>
    <dependency>
    

    이러한 종속성 중 일부는 필요하지 않을 수 있습니다

  4. ==============================

    4.다른 사람들이 java를 사용하여 원격으로 HIVE 쿼리를 실행하는 데 필요한 것이 무엇인지 궁금해합니다.

    다른 사람들이 java를 사용하여 원격으로 HIVE 쿼리를 실행하는 데 필요한 것이 무엇인지 궁금해합니다.

    Java 코드

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class Runner
    { 
            private static String driverName = "org.apache.hive.jdbc.HiveDriver";
            public static void main(String[] args) throws SQLException {
    
                    try {
                            // Register driver and create driver instance
                            Class.forName(driverName);
                    } catch (ClassNotFoundException ex) {
                          ex.printStackTrace();
                    }
    
                    // get connection
                    System.out.println("before trying to connect");
                    Connection con = DriverManager.getConnection("jdbc:hive2://[HOST IP]:10000/", "hive", "");
                    System.out.println("connected");
    
                    // create statement
                    Statement stmt = con.createStatement();
    
                    // execute statement
                    stmt.executeQuery("show tables");
    
                    con.close();
            }
    }
    

    유일하게 필요한 의존성을 가진 pom 파일과 함께 ..

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>test-executor</groupId>
        <artifactId>test-executor</artifactId>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <hadoop.version>2.5.2</hadoop.version>
        </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
    </dependencies>
    </project>
    
  5. ==============================

    5.CDH5.4.1 버전에서도 동일한 문제가 발생했습니다. 아래 코드를 사용하여 POM 파일을 업데이트했으며 저에게 효과적이었습니다.

    CDH5.4.1 버전에서도 동일한 문제가 발생했습니다. 아래 코드를 사용하여 POM 파일을 업데이트했으며 저에게 효과적이었습니다.

    My Hadoop 버전은 Hadoop 2.6.0-cdh5.4.1이고 Hive 버전은 Hive 1.1.0-cdh5.4.1입니다.

    <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>0.13.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>0.13.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libfb303</artifactId>
            <version>0.9.0</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.6.0</version>
        </dependency>
    

    이 POM 업데이트로 해결했습니다.

  6. ==============================

    6.당신이 cloudera와 함께 일하고있는 것 같아서, 나는 당신이 그들의 사이트에 가면 jdbc를 다운로드 할 수 있기 때문에 maven의 repo가 ​​오래되었다는 것을 발견했다. https://www.cloudera.com/downloads/connectors/hive/jdbc/2-5-20.html 드라이버가 하이브에있는 것보다 더 많은 기능을 지원하는 것 같습니다. 나는 그들이 addBatch를 구현했다는 것을 알아 차렸다. 나는 그들이 maven에이 라이브러리를 가지고 있었으면 좋겠다. 어쩌면 누군가가 maven을 사용하지 못하게 할 수 있습니다.

    당신이 cloudera와 함께 일하고있는 것 같아서, 나는 당신이 그들의 사이트에 가면 jdbc를 다운로드 할 수 있기 때문에 maven의 repo가 ​​오래되었다는 것을 발견했다. https://www.cloudera.com/downloads/connectors/hive/jdbc/2-5-20.html 드라이버가 하이브에있는 것보다 더 많은 기능을 지원하는 것 같습니다. 나는 그들이 addBatch를 구현했다는 것을 알아 차렸다. 나는 그들이 maven에이 라이브러리를 가지고 있었으면 좋겠다. 어쩌면 누군가가 maven을 사용하지 못하게 할 수 있습니다.

  7. from https://stackoverflow.com/questions/28760141/connect-hive-through-java-jdbc by cc-by-sa and MIT license