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:-
- ruche-jdbc*.pot
- ruche-service*.pot
- libfb303-0.9.0.pot
- libthrift-0.9.0.pot
- log4j-1.2.16.pot
- slf4j-api-1.6.1.pot
- slf4j-log4j12-1.6.1.pot
- 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!
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.
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>
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
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>
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.
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.