"Ungültiger name der Methode: 'ausführen'" Fehler mit Hive-Client in Java
Ich bin mit CDH-4.2.1-1.cdh4.2.1.p0.5 in einer cluster-set-up mit Cloudera Manager und ich werde versuchen, den Bienenstock Beispiel die Arbeit mit dem Hive-API in Java.
Die hive version, die ich verwende, ist 0.10 (hive-hwi-0.10.0-cdh4.2.1.jar) und ich bin versucht, setup-ein einfaches Beispiel gemäß den Anweisungen in dieser url: https://cwiki.apache.org/confluence/display/Hive/HiveClient
Beim ausführen meines Codes (die source-code am Ende des Beitrags), ich erhalte die folgende Fehlermeldung:
Exception in thread "main" java.sql.SQLException: org.apache.thrift.TApplicationException: Invalid method name: 'execute'
at org.apache.hadoop.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:191)
at org.apache.hadoop.hive.jdbc.HiveStatement.execute(HiveStatement.java:127)
at org.apache.hadoop.hive.jdbc.HiveConnection.configureConnection(HiveConnection.java:126)
at org.apache.hadoop.hive.jdbc.HiveConnection.<init>(HiveConnection.java:121)
at org.apache.hadoop.hive.jdbc.HiveDriver.connect(HiveDriver.java:104)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:221)
Ich habe die Suche in Google für eine Weile jetzt, und ich finde keine Lösung für dieses problem.
Wer kann mir einen Tipp geben könnte was das Problem verursacht?
Vielen Dank im Voraus,
Robbbie
Code der den Fehler verursacht:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.log4j.Logger;
public class HiveJob {
private static Logger mLogger = Logger.getLogger(HiveJob.class);
private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
HiveJob myJob = new HiveJob();
myJob.execute();
}
public void execute() throws SQLException {
mLogger.info("Start HiveJob");
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
Connection con = DriverManager.getConnection("jdbc:hive://myHiveServer:9083/default", "", "");
Statement stmt = con.createStatement();
String sql = "SHOW TABLES";
System.out.println("Running: " + sql);
ResultSet res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(1));
}
mLogger.info("HiveJob executed!");
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die jdbc-url verweist auf myHiveServer:9083 , die den metastore Standard-port. Sie werden immer Fehler, weil metastore unterstützt nicht das gleiche thrift-api als hive server.
Sie müssen angeben, dass der host + port von hiveserver(1 oder 2). Der Standard-port ist 10000.
Hinzufügen hive2 und ändern den port würde nicht alleine arbeiten. Ich habe festgestellt mit dem gleichen Problem und finden, dass hive2-Dienst muss gestartet werden, in cloudera VM. ändern Sie den Treiber von der oben genannten "org.apache.hive.jdbc.HiveDriver" und dann Ports 10000. es funktioniert bei mir perfekt.Der link, den Sie wurden mit war alten und hive wurde neu geschrieben, um Unterstützung gleichzeitiger verbindungen genannt, wie hive2.
dieser link wird Ihnen einen perfekten code, die würde richtig laufen für die Konnektivität.
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Kunden
Ändern 'jdbc:hive:' to 'jdbc:hive2:" und versuchen Sie es erneut
Wenn Sie ändern, um hive2 müssen Sie auch ändern Sie den Treiber-Pfad auf org.apache.hive.jdbc.HiveDriver
Finden Sie unter:http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/4.2.0/CDH4-Installation-Guide/cdh4ig_topic_18_5.html
Müssen Sie 2 Dinge zur Lösung dieses Problems
Ändern Sie die port-Nummer aus 9083 bis 10000. Bcz-Standard-port-Nummer ist 10000 für hive-thrift-server...
- Und nur Sie brauchen, um zu starten hive-thrift-server... so wie hier
$ hive-service hiveserver &
Wenn thrift-server gestartet dann Ihre Ausgabe sollte