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: -
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!
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
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.
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>
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.
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>
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.