Hadoop Hive - Как я могу добавить jar для использования с клиентом Hive JDBC? - PullRequest
3 голосов
/ 17 января 2012

Итак, у меня есть hdfs и hive, работающие вместе. У меня также есть драйвер jdbc для работы Hive, чтобы я мог выполнять удаленные вызовы jdbc.

Теперь я добавил пользовательскую функцию Hive (UDF). Он отлично работает в CLI ... Я даже автоматически загружаю флягу и связанную функцию через файл .hiverc. Однако я не могу заставить это работать, используя драйвер hive jdbc. Я думал, что он также будет использовать файл .hiverc (по умолчанию находится в / usr / lib / hive / bin /), но, похоже, он не работает. Я также попытался сначала добавить его с помощью команды SQL «add jar», но независимо от того, куда я поместил файл jar, я получаю сообщение об ошибке в файле hive.log, что файл не может быть найден.

Кто-нибудь знает, как это сделать? Я использую Cloudera Distribution (CDH3u2), который использует Hive-0.7.1.

Спасибо, заранее.

Ответы [ 3 ]

3 голосов
/ 18 сентября 2013

Согласно списку рассылки разработчиков Hive, в текущей версии Hive (0.9) нет решения этой проблемы. Чтобы обойти это, я использовал класс фабрики соединений, который правильно регистрирует jar-файлы и функции при каждом запуске сеанса соединения. Код ниже работает чудесно:

    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();
    }

}
}
2 голосов
/ 09 мая 2012

Я также использую драйвер JDBC для подключения к Hive.Я вставляю jar в главный узел кластера, где также установлен Hive, и затем использую абсолютный путь к файлу (на главном узле) в моей команде add jar.Я запускаю команду add jar через драйвер JDBC, как и любую другую команду HQL.

0 голосов
/ 17 января 2012

Я думаю, что драйвер JDBC использует Thrift, что означает, что JAR, вероятно, должен находиться на сервере Thrift (сервере hive, к которому вы подключаетесь в строке conn), и в пути к классам улья.

...