Connexion Hive thorugh Java JDBC


Il y a une question ici se connecter de java à Hive mais le mien est différent

Ma ruche s'exécute sur machine1 et j'ai besoin de passer quelques requêtes en utilisant le serveur Java s'exécutant sur machine2. Si je comprends bien, Hive a une interface JDBC dans le but de recevoir des requêtes distantes. J'ai pris le code d'ici- HiveServer2 Clients

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

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

Cependant, j'ai obtenu java.lang.NoClassDefFoundError erreur au moment de la compilation Erreur complète:

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 chez StackOverflow a recommandé d'ajouter des dépendances API Hadoop dans Maven - Hive Error

Je ne comprendre pourquoi ai-je besoin de l'API hadoop pour qu'un client se connecte à 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?

Modifier: J'utilise Cloudera (5.3.1), je pense que je dois 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 compiler et je ne devrais avoir de problèmes qu'à l'exécution!

Author: Community, 2015-02-27

6 answers

Au cas où si vous n'avez pas encore résolu cela, je l'ai essayé. Et j'avais besoin des dépendances suivantes pour qu'il compile et s'exécute:

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 hive est probablement écrite sur une version/distribution plus ancienne.

Votre exception est due au pot hadoop-common manquant, qui a le org.apache.hadoop.conf.Configuration.

J'espère que cela aide.

 7
Author: Shyam, 2015-03-09 04:29:10

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

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

Autre remarque: vous pourriez obtenir 'Le champ requis 'client_protocol' n'est pas défini!' lors de l'utilisation du dernier jdbc contre une ancienne ruche. Si c'est le cas, changez la version jdbc en 1.1.0:

<dependency>
  <groupId>org.apache.hive</groupId>
  <artifactId>hive-jdbc</artifactId>
  <version>1.1.0</version>
  <classifier>standalone</classifier>
</dependency>
 4
Author: Leon li, 2016-01-05 18:34:45

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 requises

 3
Author: Mangat Rai Modi, 2015-03-09 09:16:02

Pour les autres qui se demandent ce qui est exactement nécessaire pour exécuter à distance une requête HIVE en utilisant 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
Author: Mez, 2015-11-02 09:59:09

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 Ruche version 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 POM.

 1
Author: Manindar, 2016-04-25 12:48:14

Il semble que vous travailliez tous avec cloudera, j'ai trouvé que le dépôt dans 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 plus de fonctionnalités que celui de hive. Je remarque qu'ils ont addBatch implémenté. J'aimerais juste qu'ils aient ces bibliothèques dans maven. Peut-être que quelqu'un peut trouver où les obtenir en utilisant maven.

 0
Author: pitchblack408, 2018-05-14 23:50:01