23

I am using Hive 0.12, and I'm trying the JDBC from apache. When I try to run the code, I get apache.thrift.TApplicationException.

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

}

I imported all the necessary jars, and when I try to run my code, I get the following error:

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

How can I fix this?

user3782579
  • 315
  • 1
  • 4
  • 15
  • 1
    I solved it, the error was in hive-jdbc. It was 0.13, I changed it to 0.12 (I am running hive 0.12) – user3782579 Jul 11 '14 at 10:08
  • In my case changing it to 0.12 is giving Required field 'serverProtocolVersion' is unset! [link to my posted question](http://stackoverflow.com/questions/27614723/server-protocol-version-is-unset-hive-jdbc) – Count Dec 23 '14 at 07:49
  • worked for me. i was connecting using beeline from hive14 (because for some ridiculous reasons you cannot download older versions from Hive website), while our prod cluster runs on hive 12 and was getting this error. In the end i copied hive binaries from prod to my pc and it worked! – Kranach Jan 26 '15 at 20:45

4 Answers4

34

This indicates a version mismatch between client and server, namely that the client is newer than the server, which is your case.

Ihar Sadounikau
  • 741
  • 6
  • 20
16

Got same issue. It works if you set

hive JDBC Maven Repo version as 1.1.0 .

Check this jira. Newest hive-jdbc version is not supported with HIve 0.13. https://issues.apache.org/jira/browse/HIVE-6050

Add this in your pom.

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-jdbc</artifactId>
  <version>1.1.0</version>
  <classifier>standalone</classifier>
</dependency>
Kamaldeep Singh
  • 492
  • 4
  • 8
0

Guys even I faced the same issue and go the solution by doing the following steps

Step 01:- Include the Hive lib jars on yours eclipse(which ever might be the IDE) by using the below link.

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

Step 02: add hadoop-core-1.1.0 jar

as everyone mentioned this error occurs due to the version mismatch with hadoop standalone and hadoop core.

Sunny
  • 11
  • 2
-1

I have faces same issue. I fixed this by following below steps.

<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-jdbc</artifactId>
    <version>1.1.0</version>
    <classifier>standalone</classifier>
    <exclusions>
        <exclusion>
            <groupId>org.eclipse.jetty.aggregate</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • Make sure that, you add above dependency.
  • Class.forName("org.apache.hive.jdbc.HiveDriver"); Add this before calling DriverManager.getConnection(url);
  • Represent hive url by IP instead of hostname.
Ganesh
  • 677
  • 8
  • 11