beeline jdbc hadoop hive hdfs

jdbc - beeline windows



Hadoop Hive: ¿cómo puedo ''agregar jar'' para usar con el cliente Hive JDBC? (3)

Creo que el controlador JDBC usa Thrift, lo que significa que probablemente el JAR debe estar en el servidor Thrift (el servidor colmena al que se conecta en su cadena de conexión), y en el classpath hive allí.

Entonces, tengo hdfs y colmenas trabajando juntas. También tengo el controlador jdbc para que Hive funcione para que pueda hacer llamadas jdbc remotas.

Ahora, he agregado una función definida por el usuario de Hive (UDF). Funciona muy bien en la CLI ... Incluso cargo el jar y la función asociada automáticamente a través del archivo .hiverc. Sin embargo, no puedo hacer que funcione con el controlador hive jdbc. Pensé que también usaría el archivo .hiverc (por defecto, ubicado en / usr / lib / hive / bin /), pero parece que no funciona. También intenté agregarlo a través de un comando SQL ''agregar jar'' como la primera cosa, pero no importa dónde coloque el archivo jar, aparece un error en hive.log que dice que no se puede encontrar el archivo.

Alguien sabe cómo hacer esto? Estoy usando Cloudera Distribution (CDH3u2), que usa Hive-0.7.1.

Gracias por adelantado.


Yo uso el controlador JDBC para conectarme a Hive también. Compruebo mi jar en el nodo maestro del clúster, que es también donde está instalado Hive y luego uso la ruta absoluta al archivo (en el nodo maestro) en mi comando add jar. Emití el comando agregar jar a través del controlador JDBC al igual que cualquier otro comando HQL.


Según la lista de correo de desarrolladores de Hive, en la versión actual de Hive (0.9) no hay solución para este problema. Para solucionar este problema, utilicé una clase de fábrica de conexiones que registraba correctamente las jarras y las funciones cada vez que se iniciaba una sesión de conexión. El siguiente código funciona maravillosamente:

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