2012-01-17 46 views
3

所以,我有hdfs和hive一起工作。我也有用于Hive功能的jdbc驱动程序,以便可以进行远程jdbc调用。Hadoop Hive - 如何添加jar以用于Hive JDBC客户端?

现在,我添加了一个Hive用户定义函数(UDF)。它在CLI中效果很好......我甚至通过.hiverc文件自动加载jar和相关函数。但是,我无法使用配置单元jdbc驱动程序来使用它。我认为它也会使用.hiverc文件(默认情况下,位于/ usr/lib/hive/bin /中),但它似乎不起作用。我也尝试通过'add jar'SQL命令添加它作为第一件事,但无论我把jar文件放在哪里,我都会在hive.log中发现该文件找不到的错误。

任何人都知道如何做到这一点?我使用Cloudera Distribution(CDH3u2),它使用Hive-0.7.1。

谢谢,提前。

回答

2

我还使用JDBC驱动程序连接到Hive。我scp我的jar到集群的主节点上,这也是Hive的安装位置,然后在我的add jar命令中使用文件的绝对路径(在主节点上)。与其他HQL命令一样,我通过JDBC驱动程序发出add jar命令。

0

我认为JDBC驱动程序使用Thrift,这意味着JAR可能需要位于Thrift服务器(您在conn字符串中连接的配置单元服务器)以及那里的配置单元类路径中。

+0

感谢您的快速反应。然而,我不确定我会在哪里做到这一点。我试图将这些jar添加到服务器的hadoop-env.sh文件(CLASSPATH)以及hive-env.sh文件(CLASSPATH)。这些似乎都没有工作。 – Wanderer 2012-01-17 17:59:21

3

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

} 
}