복붙노트

[HADOOP] Hadoop Hive-Hive JDBC 클라이언트와 함께 사용하기 위해 'jar'을 추가하려면 어떻게해야합니까?

HADOOP

Hadoop Hive-Hive JDBC 클라이언트와 함께 사용하기 위해 'jar'을 추가하려면 어떻게해야합니까?

그래서 hdfs와 hive가 함께 작동합니다. 또한 원격 jdbc 호출을 할 수 있도록 Hive 기능을위한 jdbc 드라이버가 있습니다.

이제 HUD 사용자 정의 함수 (UDF)를 추가했습니다. CLI에서 훌륭하게 작동합니다 ... 심지어 jar 파일과 관련 기능을 .hiverc 파일을 통해 자동으로로드합니다. 그러나 hive jdbc 드라이버를 사용 하여이 작업을 수행 할 수는 없습니다. 나는 또한 .hiverc 파일 (기본적으로 / usr / lib / hive / bin /에 있음)을 사용할 것이라고 생각했지만 작동하지 않는 것 같습니다. 또한 'add jar'SQL 명령을 통해 첫 번째 항목으로 추가하려고 시도했지만 jar 파일을 어디에 배치하든 파일을 찾을 수 없다는 오류가 hive.log에 표시됩니다.

아무도 이것을하는 방법을 알고 있습니까? Hive-0.7.1을 사용하는 Cloudera Distribution (CDH3u2)을 사용하고 있습니다.

미리 감사드립니다.

해결법

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

    1.JDBC 드라이버를 사용하여 Hive에도 연결합니다. jar 파일을 클러스터의 마스터 노드로 이동합니다.이 위치는 Hive가 설치되어있는 곳이며 add jar 명령의 파일 (마스터 노드에서)의 절대 경로를 사용합니다. 다른 HQL 명령과 마찬가지로 JDBC 드라이버를 통해 add jar 명령을 실행합니다.

    JDBC 드라이버를 사용하여 Hive에도 연결합니다. jar 파일을 클러스터의 마스터 노드로 이동합니다.이 위치는 Hive가 설치되어있는 곳이며 add jar 명령의 파일 (마스터 노드에서)의 절대 경로를 사용합니다. 다른 HQL 명령과 마찬가지로 JDBC 드라이버를 통해 add jar 명령을 실행합니다.

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

    2.Hive 개발자 메일 링리스트에 따르면 현재 Hive 버전 (0.9)에는이 문제에 대한 해결책이 없습니다. 이 문제를 해결하기 위해 연결 세션이 시작될 때마다 항아리와 기능을 올바르게 등록하는 연결 팩토리 클래스를 사용했습니다. 다음 코드는 훌륭하게 작동합니다.

    Hive 개발자 메일 링리스트에 따르면 현재 Hive 버전 (0.9)에는이 문제에 대한 해결책이 없습니다. 이 문제를 해결하기 위해 연결 세션이 시작될 때마다 항아리와 기능을 올바르게 등록하는 연결 팩토리 클래스를 사용했습니다. 다음 코드는 훌륭하게 작동합니다.

        package com.rapidminer.operator.bigdata.runner.helpers;
    import java.sql.*;
    
    /** A Hive connection factory utility 
    @author Marcelo Beckmann
    */
    public class ConnectionFactory {
    
    private static ConnectionFactory instance;
    
    /** Basic attributes to make the connection*/
    public String url = "jdbc:hive://localhost:10000/default";
    public final String DRIVER = "org.apache.hadoop.hive.jdbc.HiveDriver";
    
    public static ConnectionFactory getInstance(){
        if (instance==null)
            instance = new ConnectionFactory();
        return instance;
    }
    private ConnectionFactory()
    {}
    /**
     * Obtains a hive connection.
     * Warning! To use simultaneous connection from the Thrift server, you must change the
     * Hive metadata server from Derby to other database (MySQL for example).
     * @return
     * @throws Exception
     */
    public Connection getConnection() throws Exception {
    
        Class.forName(DRIVER);
    
        Connection connection = DriverManager.getConnection(url,"","");
    
        runInitializationQueries(connection);
        return connection;
    }
    
    /**
     * Run initialization queries after the connection be obtained. This initialization was done in order
     * to workaround a known Hive bug (HIVE-657).
     * @throws SQLException
     */
    private void runInitializationQueries(Connection connection) throws SQLException
    {
        Statement stmt = null;
        try {
            //TODO Get the queries from a .hiverc file
            String[] args= new String[3];
            args[0]="add jar /home/hadoop-user/hive-0.9.0-bin/lib/hive-beckmann-functions.jar";  
            args[1]="create temporary function row_number as 'com.beckmann.hive.RowNumber'"; 
            args[2]="create temporary function sequence as 'com.beckmann.hive.Sequence'";
            for (String query:args)
            {
                stmt.execute(query);
            }
        }
        finally {
            if (stmt!=null)
                stmt.close();
        }
    
    }
    }
    
  3. ==============================

    3.JDBC 드라이버가 Thrift를 사용한다고 생각합니다. 이는 JAR이 아마도 Thrift 서버 (conn 문자열에 연결하는 하이브 서버)와 하이브 클래스 경로에 있어야 함을 의미합니다.

    JDBC 드라이버가 Thrift를 사용한다고 생각합니다. 이는 JAR이 아마도 Thrift 서버 (conn 문자열에 연결하는 하이브 서버)와 하이브 클래스 경로에 있어야 함을 의미합니다.

  4. from https://stackoverflow.com/questions/8898908/hadoop-hive-how-can-i-add-jar-for-use-with-the-hive-jdbc-client by cc-by-sa and MIT license