2014-07-11 31 views
13

我正在使用Hive 0.12,并且我正在尝试来自apache的JDBC。当我尝试运行代码时,出现apache.thrift.TApplicationException。必填字段'client_protocol'未设置

import java.sql.SQLException; 
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.sql.DriverManager; 

public class HiveJdbcClient { 
private static String driverName = "org.apache.hive.jdbc.HiveDriver"; 

/** 
* @param args 
* @throws SQLException 
*/ 
public static void main(String[] args) throws SQLException { 
    try { 
     Class.forName(driverName); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     System.exit(1); 
    } 
    //replace "hive" here with the name of the user the queries should run as 
    Connection con =  DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", ""); 
    Statement stmt = con.createStatement(); 
    String tableName = "testHiveDriverTable"; 
    stmt.execute("drop table if exists " + tableName); 
    stmt.execute("create table " + tableName + " (key int, value string)"); 
    // show tables 
    String sql = "show tables '" + tableName + "'"; 
    System.out.println("Running: " + sql); 
    ResultSet res = stmt.executeQuery(sql); 
    if (res.next()) { 
     System.out.println(res.getString(1)); 
    } 
    // describe table 
    sql = "describe " + tableName; 
    System.out.println("Running: " + sql); 
    res = stmt.executeQuery(sql); 
    while (res.next()) { 
     System.out.println(res.getString(1) + "\t" + res.getString(2)); 
    } 

    // load data into table 
    // NOTE: filepath has to be local to the hive server 
    // NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line 
    String filepath = "/tmp/a.txt"; 
    sql = "load data local inpath '" + filepath + "' into table " + tableName; 
    System.out.println("Running: " + sql); 
    stmt.execute(sql); 

    // select * query 
    sql = "select * from " + tableName; 
    System.out.println("Running: " + sql); 
    res = stmt.executeQuery(sql); 
    while (res.next()) { 
     System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2)); 
    } 

    // regular hive query 
    sql = "select count(1) from " + tableName; 
    System.out.println("Running: " + sql); 
    res = stmt.executeQuery(sql); 
    while (res.next()) { 
     System.out.println(res.getString(1)); 
    } 
} 

}

我进口的所有必要的罐子,当我尝试运行我的代码,我得到以下错误:

org.apache.thrift.TApplicationException: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null) 

我怎样才能解决这个问题?

+1

我解决了它,错误是在hive-jdbc中。它是0.13,我改变它为0.12(我正在运行配置单元0.12) – user3782579

+0

在我的情况下,将其更改为0.12将给出 必填字段'serverProtocolVersion'未设置! [链接到我发布的问题](http://stackoverflow.com/questions/27614723/server-protocol-version-is-unset-hive-jdbc) – Count

+0

为我工作。我使用hive14的直线连接(因为一些荒谬的原因,你不能从Hive网站下载旧版本),而我们的prod集群运行在配置单元12上,并且出现这个错误。最后,我将蜂巢二进制文件从prod复制到我的电脑上,它工作正常! – Kranach

回答

11

得到同样的问题。如果你设置了

配置单元JDBC Maven Repo版本为1.1.0,

检查此jira。 HIve 0.13不支持最新的hive-jdbc版本。 https://issues.apache.org/jira/browse/HIVE-6050

将此项添加到您的Pom。

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

这表示客户端和服务器之间的版本不匹配,即客户端比服务器更新,这是您的情况。

0

家伙连我面临着同样的问题,去通过执行以下步骤

步骤01解决方案: - 包括在你的蜂房的lib罐子通过使用下面的链接蚀(这曾经可能是IDE)。

http://mirrors.supportex.net/apache/hive/hive-1.0.1/(Apache的蜂房-1.0.1-bin.tar.gz)

步骤02:添加Hadoop的芯 - 1.1.0罐

如大家提到这个错误发生是由于版本与hadoop独立和hadoop核心不匹配。