web-dev-qa-db-fra.com

Le champ requis 'client_protocol' n'est pas défini

J'utilise Hive 0.12 et j'essaie le JDBC d'Apache. Lorsque j'essaie d'exécuter le code, j'obtiens 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));
    }
}

}

J'ai importé tous les fichiers nécessaires et lorsque j'essaie d'exécuter mon code, le message d'erreur suivant s'affiche:

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

Comment puis-je réparer cela?

15
user3782579

Cela indique une incompatibilité de version entre le client et le serveur, à savoir que le client est plus récent que le serveur, ce qui est votre cas.

20
Ihar Sadounikau

J'ai le même problème. Cela fonctionne si vous définissez 

Hive JDBC Maven Repo version 1.1.0. 

Vérifiez cette jira. La dernière version de Hive-jdbc n’est pas prise en charge avec Hive 0.13. https://issues.Apache.org/jira/browse/Hive-6050

Ajoutez ceci dans votre pom. 

<dependency>
  <groupId>org.Apache.Hive</groupId>
  <artifactId>Hive-jdbc</artifactId>
  <version>1.1.0</version>
  <classifier>standalone</classifier>
</dependency>
13
Kamaldeep Singh

Les gars, même j'ai fait face au même problème et aller de la solution en procédant comme suit

Etape 01: - Incluez les fichiers jar de la librairie Hive sur votre Eclipse (qui pourrait être l’IDE) en utilisant le lien ci-dessous.

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

Étape 02: ajouter le fichier hadoop-core-1.1.0

comme tout le monde l’a mentionné, cette erreur est due à une non-concordance de version avec Hadoop Standalone et Hadoop Core.

0
Sunny