web-dev-qa-db-fra.com

Connectez Hive via Java JDBC

Il y a une question ici connectez-vous de Java à Hive mais le mien est différent 

Mon Hive s'exécutant sur machine1 et j'ai besoin de transmettre des requêtes à l'aide d'un serveur Java s'exécutant sur machine2. Si je comprends bien, Hive a une interface JDBC permettant de recevoir des requêtes distantes. J'ai pris le code d'ici - Clients HiveServer2

J'ai installé les dépendances écrites dans l'article: -

  1. Hive-jdbc * .jar 
  2. Service de ruche * .jar
  3. libfb303-0.9.0.jar 
  4. libthrift-0.9.0.jar
  5. log4j-1.2.16.jar
  6. slf4j-api-1.6.1.jar
  7. slf4j-log4j12-1.6.1.jar
  8. commons-logging-1.0.4.jar

Cependant, j’ai eu une erreur Java.lang.NoClassDefFoundError lors de la compilation Erreur totale:

Exception in thread "main" Java.lang.NoClassDefFoundError: org/Apache/hadoop/conf/Configuration
    at org.Apache.Hive.jdbc.HiveConnection.createBinaryTransport(HiveConnection.Java:393)
    at org.Apache.Hive.jdbc.HiveConnection.openTransport(HiveConnection.Java:187)
    at org.Apache.Hive.jdbc.HiveConnection.<init>(HiveConnection.Java:163)
    at org.Apache.Hive.jdbc.HiveDriver.connect(HiveDriver.Java:105)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:571)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:215)
    at com.bidstalk.tools.RawLogsQuerySystem.HiveJdbcClient.main(HiveJdbcClient.Java:25)

Une autre question de StackOverflow recommandait d’ajouter des dépendances d’API Hadoop dans Maven - Hive Error

Je ne comprends pas pourquoi j'ai besoin de l'API Hadoop pour qu'un client puisse se connecter à Hive. Le pilote JDBC ne devrait-il pas être agnostique du système de requête sous-jacent? J'ai juste besoin de passer une requête SQL?

Edit: J'utilise Cloudera (5.3.1), je pense que j'ai besoin d'ajouter des dépendances CDH. L’instance Cloudera exécute Hadoop 2.5.0 et HiveServer2

Mais les serveurs sont à la machine 1. Sur la machine, le code devrait au moins être compilé et je devrais avoir des problèmes uniquement à l'exécution!

7
Mangat Rai Modi

Répondre à ma propre question!

Avec quelques succès et essais, j'ai ajouté les dépendances suivantes sur mon fichier pom et depuis lors, je suis capable d'exécuter du code sur les clusters CHD 5.3.1 et 5.2.1.

<dependency>
    <groupId>org.Apache.Hive</groupId>
    <artifactId>Hive-jdbc</artifactId>
    <version>0.13.1-cdh5.3.1</version>
</dependency>
<dependency>
    <groupId>org.Apache.thrift</groupId>
    <artifactId>libthrift</artifactId>
    <version>0.9.0</version>
</dependency>
<dependency>
    <groupId>org.Apache.thrift</groupId>
    <artifactId>libfb303</artifactId>
    <version>0.9.0</version>
</dependency>
<dependency>
    <groupId>org.Apache.hadoop</groupId>
    <artifactId>hadoop-core</artifactId>
    <version>2.5.0-mr1-cdh5.3.1</version>
</dependency>

<dependency>
    <groupId>org.Apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.5.0-cdh5.3.1</version>
</dependency>
<dependency>
    <groupId>org.Apache.Hive</groupId>
    <artifactId>Hive-exec</artifactId>
    <version>0.13.1-cdh5.3.1</version>
</dependency>
<dependency>
    <groupId>org.Apache.hadoop</groupId>
    <artifactId>hadoop-hdfs</artifactId>
    <version>2.5.0-cdh5.3.1</version>
</dependency>
<dependency>

Veuillez noter que certaines de ces dépendances peuvent ne pas être nécessaires

3
Mangat Rai Modi

Au cas où vous ne résoudriez pas encore le problème, je l’ai essayé ..__ et j’avais besoin des dépendances suivantes pour le compiler et le lancer:

libthrift-0.9.0-cdh5-2.jar
httpclient-4.2.5.jar
httpcore-4.2.5.jar
commons-logging-1.1.3.jar
Hive-common.jar
slf4j-api-1.7.5.jar
Hive-metastore.jar
Hive-service.jar
hadoop-common.jar
Hive-jdbc.jar
guava-11.0.2.jar

La documentation de Hive est probablement écrite avec une version/distribution plus ancienne.

Votre exception est due au fichier hadoop-common manquant, qui contient le org.Apache.hadoop.conf.Configuration.

J'espère que cela t'aides.

7
Shyam

Obtenir la même erreur en essayant d'utiliser Hive-jdbc 1.2.1 contre Hive 0.13. Comparaison à la longue liste dans d’autres réponses. Maintenant, nous utilisons ces deux:

Hive-jdbc-1.2.1-standalone.jar
hadoop-common-2.7.1.jar

Autre note latérale: vous pourriez obtenir ' Le champ obligatoire' client_protocol 'n'est pas défini! 'lors de l'utilisation de la dernière version de jdbc contre un Hive plus ancien. Si c'est le cas, changez la version de jdbc en 1.1.0:

<dependency>
  <groupId>org.Apache.Hive</groupId>
  <artifactId>Hive-jdbc</artifactId>
  <version>1.1.0</version>
  <classifier>standalone</classifier>
</dependency>
5
Leon li

J'ai rencontré le même problème avec la version CDH5.4.1. J'ai mis à jour mon fichier POM avec le code ci-dessous et cela a fonctionné pour moi.

Ma version Hadoop est Hadoop 2.6.0-cdh5.4.1 et la version de Hive est Hive 1.1.0-cdh5.4.1

<dependency>
        <groupId>org.Apache.Hive</groupId>
        <artifactId>Hive-exec</artifactId>
        <version>0.13.0</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.Hive</groupId>
        <artifactId>Hive-jdbc</artifactId>
        <version>0.13.0</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.thrift</groupId>
        <artifactId>libthrift</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.thrift</groupId>
        <artifactId>libfb303</artifactId>
        <version>0.9.0</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.3</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.6.0</version>
    </dependency>

J'ai résolu avec cette mise à jour de POM.

1
Manindar

Pour ceux qui se demandent exactement ce qu'il faut faire pour exécuter à distance une requête Hive à l'aide de Java ...

Code Java

import Java.sql.Connection;
import Java.sql.DriverManager;
import Java.sql.SQLException;
import Java.sql.Statement;

public class Runner
{ 
        private static String driverName = "org.Apache.Hive.jdbc.HiveDriver";
        public static void main(String[] args) throws SQLException {

                try {
                        // Register driver and create driver instance
                        Class.forName(driverName);
                } catch (ClassNotFoundException ex) {
                      ex.printStackTrace();
                }

                // get connection
                System.out.println("before trying to connect");
                Connection con = DriverManager.getConnection("jdbc:Hive2://[Host IP]:10000/", "Hive", "");
                System.out.println("connected");

                // create statement
                Statement stmt = con.createStatement();

                // execute statement
                stmt.executeQuery("show tables");

                con.close();
        }
}

Avec le fichier pom avec les seules dépendances requises ..

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>test-executor</groupId>
    <artifactId>test-executor</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <hadoop.version>2.5.2</hadoop.version>
    </properties>
<dependencies>
    <dependency>
        <groupId>org.Apache.Hive</groupId>
        <artifactId>Hive-exec</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.Hive</groupId>
        <artifactId>Hive-jdbc</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>${hadoop.version}</version>
    </dependency>
    <dependency>
        <groupId>org.Apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>${hadoop.version}</version>
    </dependency>
</dependencies>
</project>
1
Mez

On dirait que vous travaillez tous avec cloudera, j'ai trouvé que le dépôt en maven avait l'air vieux, car si vous allez sur leur site, vous pouvez télécharger leur jdbc. https://www.cloudera.com/downloads/connectors/Hive/jdbc/2-5-20.html Le pilote semble prendre en charge davantage de fonctionnalités que celui de Hive. Je remarque qu'ils ont addBatch implémenté. Je souhaite juste qu'ils avaient ces bibliothèques dans Maven. Peut-être que quelqu'un peut trouver où les obtenir en utilisant Maven.

0
pitchblack408