2016-07-11 3 views
0

Ich bin neu bei Apache Drill und habe es eingerichtet, um lokal im Embedded-Modus und über Web-Schnittstelle zu laufen. Beim Versuch, über Java-Client mit JDBC zuzugreifen, besteht jedoch folgendes Problem.Apache Drill JDBC Java Client Ausnahme

Nach Drill-Dokumentation und ein paar Beiträge hier ist mein Setup wie:

<dependency> 
    <groupId>org.apache.drill.exec</groupId> 
    <artifactId>drill-jdbc</artifactId> 
    <version>1.7.0</version> 
</dependency> 

Code:

public static void main(String[] args) { 
    Class.forName("org.apache.drill.jdbc.Driver"); 
    **Connection connection = DriverManager.getConnection("jdbc:drill:zk=local");** 
    Statement st = connection.createStatement(); 
    ResultSet rs = st.executeQuery("SELECT * from cp.`employee` LIMIT 10"); 
    while (rs.next()) { 
    System.out.println(rs.getString(1)); 
    } 
... 

Es gibt keine jedoch Probleme kompilieren, auf die oben ausgeführt, erhalte ich die folgende OutOfMemoryException im markierten Bereich des obigen Codes:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/drill/exec/exception/OutOfMemoryException 
at org.apache.drill.jdbc.impl.DrillJdbc41Factory.newDrillConnection(DrillJdbc41Factory.java:64) 
at org.apache.drill.jdbc.impl.DrillFactory.newConnection(DrillFactory.java:69) 
at net.hydromatic.avatica.UnregisteredDriver.connect(UnregisteredDriver.java:126) 
at org.apache.drill.jdbc.Driver.connect(Driver.java:72) 
at java.sql.DriverManager.getConnection(DriverManager.java:664) 
at java.sql.DriverManager.getConnection(DriverManager.java:270) 
at com.mapr.drill.DrillJDBCExample.runMode1(DrillJDBCExample.java:49) 
at com.mapr.drill.DrillJDBCExample.main(DrillJDBCExample.java:21) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Caused by: java.lang.ClassNotFoundException: org.apache.drill.exec.exception.OutOfMemoryException 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
... 13 more 

Ich habe dies mit Bohrverlauf getan lokal vor Ort. Auch versucht mit jdbc URL zu ändern "jdbc:drill:drillbit=localhost";

Bitte helfen.

+0

arbeiten Sie auf Windows-Maschine oder Linux? –

+0

Scheint wie ein Build-Problem für mich. Bitte stellen Sie sicher, dass 'mvn clean install -DskipTests' erfolgreich ist. Da Drill lokal ausgeführt wird, versuchen Sie es mit '" jdbc: drill: drillbit = localhost "' (_sie erwähnten zu too_) –

+0

Arbeiten am Mac. – san

Antwort

0

Ich nehme an, Sie versuchen, Datei in Ihrem Classpath abzufragen und cp Speicher-Plugin in aktiviert.

dann Ihre Abfrage sollte

SELECT * from cp.`employee.json` LIMIT 10 

EDIT sein:

eine Sache, versuchen einfach drill-jdbc-all-1.7.0.jar bei <drill-directory>/jars/jdbc-driver in Ihrem Projekt befindet sich addieren und Ihren JDBC-Code versuchen. Dieses Glas ist mit allen abhängigen Gläsern gebündelt.

+0

Danke dev. Ich habe mit dieser Abfrage mit derselben Ausnahme versucht. – san

+0

Bitte korrigieren Sie mich, wenn falsch, aber die jdbc URL im Code zur Verfügung gestellt Bohrmaschine, um die employee.json Datei in Abfrage abholen nicht wahr? Was hat es damit zu tun, dass sich die Datei im Klassenpfad befindet? – san

+0

@ user3638201 Das Erstellen einer JDBC-Verbindung mit Drill hat nichts mit Klassenpfad und allem zu tun. Während der Drill läuft, gehen Sie zu http: // localhost: 8047/storage und Sie werden Speicher-Plugins sehen. Sie können nach denen suchen, die sich unter ** Enabled Storage Plugins ** befinden. Überprüfen Sie die Details des Plugins: https://drill.apache.org/docs/storage-plugin-registration/. Laut der Abfrage, die Sie cp-Plugin-Namen verwenden, die tatsächlich verwendet wird, um alle Dateien in Classpath –