2016-07-11 11 views
0

저는 Apache Drill을 처음 사용하고 있으며 내장 모드에서 웹 인터페이스를 통해 로컬로 실행되도록 설정했습니다. 그러나 JDBC를 사용하여 Java 클라이언트를 통해 액세스를 시도 할 때 다음 문제가 발생합니다. 드릴 문서와 여기에 몇 게시물 다음Apache 드릴 JDBC Java 클라이언트 예외

, 내 설정과 같은 것입니다 :

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

코드 :

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)); 
    } 
... 

이 더있다, 그러나 문제를 컴파일 위의 실행에있다

, 내가 얻을 다음 위 코드에서 강조 표시된 섹션의 OutOfMemoryException :

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 

드릴 런 국부적으로 ning. 또한 jdbc URL을 변경하여 시도했습니다 "jdbc:drill:drillbit=localhost";

도와주세요.

+0

Windows 컴퓨터 또는 Linux에서 작업하고 있습니까? –

+0

나에게 빌드 문제가있는 것 같습니다. 'mvn clean install -DskipTests'가 성공했는지 확인하십시오. 드릴은 로컬에서 실행되므로''jdbc : drill : drillbit = localhost "'(_you 언급도 함) –

+0

Mac에서 작업하십시오. – san

답변

0

클래스 경로에서 employee.json 파일을 쿼리하려고하고 cp 저장 장치 플러그인을 사용하도록 설정했다고 가정합니다.

단순히 프로젝트에 <drill-directory>/jars/jdbc-driver에있는 drill-jdbc-all-1.7.0.jar을 추가하고 JDBC 코드를하려고 한 가지를 시도해보십시오

그런 다음 쿼리는

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

편집해야합니다. 이 단지는 모든 종속 항아리와 번들로 제공됩니다.

+0

감사합니다. 같은 예외를 사용하여이 쿼리를 시도했습니다. – san

+0

잘못 입력했으면 코드를 수정하십시오. 코드에서 제공하는 jdbc URL을 통해 drill이 employee.json 파일을 가져 오지 않아야합니까? classpath에있는 파일과 어떤 관련이 있습니까? – san

+0

@ user3638201 드릴로 JDBC 연결을 생성하는 것은 classpath와는 아무 관련이 없습니다. 드릴이 실행 중일 때 http : // localhost : 8047/storage로 이동하면 저장 장치 플러그인이 표시됩니다. ** Enabled Storage Plugins **에있는 항목에 대해 쿼리 할 수 ​​있습니다. 플러그인 세부 정보 : https://drill.apache.org/docs/storage-plugin-registration/. 쿼리마다 cp 플러그인 이름을 사용하고 있습니다. 실제로 클래스 패스에있는 모든 파일을 쿼리하는 데 사용됩니다. –