2012-02-13 3 views
1

나는 Hadoop-0.20.0Hive-0.8.0을 사용하고 있습니다. 이제 하이브 테이블에 데이터가 있고 그것으로부터 보고서를 생성하고 싶습니다. 그 때문에 나는 iReport-4.5.0을 사용하고있다. 그 때문에 HivePlugin-0.5.nbmiReport에 다운로드합니다.하이브를 iReport에 연결하는 방법은 무엇입니까?

이제 하이브 연결을 iReport에 연결하겠습니다.

새 데이터 소스를 작성 -> 새 -> 하이브 연결

JDBC 드라이브 : org.apache.hadoop.hive.jdbc.HiveDriver

JDBC URl : jdbc : 하이브 // localhost : 10000/default

서버 주소 : 로컬 호스트

데이터베이스 : 기본

사용자 이름 : 루트

비밀번호 : somepassword

그런 다음 연결 테스트 버튼을 클릭합니다.

Exception 

Message: 
java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: java.lang.RuntimeException: Illegal Hadoop Version: Unknown (expected A.B.* format) 

Level: 

SEVERE 

Stack Trace: 

org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: 
java.lang.RuntimeException: Illegal Hadoop Version: Unknown (expected A.B.* format) 
org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:226) 
org.apache.hadoop.hive.jdbc.HiveConnection.<init>(HiveConnection.java:72) 
org.apache.hadoop.hive.jdbc.HiveDriver.connect(HiveDriver.java:110) 
com.jaspersoft.ireport.designer.connection.JDBCConnection.getConnection(JDBCConnection.java:140) 
com.jaspersoft.ireport.hadoop.hive.connection.HiveConnection.getConnection(HiveConnection.java:48) 
com.jaspersoft.ireport.designer.connection.JDBCConnection.test(JDBCConnection.java:447) 
com.jaspersoft.ireport.designer.connection.gui.ConnectionDialog.jButtonTestActionPerformed(ConnectionDialog.java:335) 
com.jaspersoft.ireport.designer.connection.gui.ConnectionDialog.access$300(ConnectionDialog.java:43) 

어떤 일이 나를 도울 수 :처럼

나는 점점 오전 오류? 내가 잘못했거나 누락 된 곳?

답변

2

"iReport에 HivePlugin-0.5.nbm도 다운로드합니다."
이것은 명확하지 않습니다. iReport 4.5에는 Hadoop Hive 커넥터가 미리 설치되어 있습니다. 왜 커넥터를 별도로 다운로드 했습니까? 이 플러그인을 설치 했습니까?

새 데이터 소스를 작성 -> 새 -> 하이브 연결
JDBC 드라이브 : org.apache.hadoop.hive.jdbc.HiveDriver

...

이 ISN 현재 Hadoop Hive 커넥터로는 가능하지 않습니다. 새로운 "Hadoop 하이브 커넥션"을 만들 때 하나의 매개 변수, 즉 URL 만 입력하면됩니다. enter image description here

Hadoop 하이브 연결을 만들 때 JDBC 연결을 만들었다 고 생각합니다. 이것은 논리적 인 일입니다. Hive는 JDBC를 통해 액세스됩니다. 그러나 하이브 JDBC 드라이버는 여전히 꽤 새롭다.그것은 많은 단점이 있습니다. 그래서 Hive 커넥터가 iReport에 추가되었습니다. Hive JDBC 드라이버를 기반으로하지만 일부 문제를 피하기 위해 주위에 래퍼가 포함되어 있습니다.

또는 iReport 4.5에 이미 포함되어있는 상단의 오래된 Hive 커넥터를 설치했을 수도 있습니다. 과거의 어떤 시점에서 Hive 커넥터를 사용하면 JDBC 드라이버와 같은 추가 정보를 입력 할 수 있습니다.

새로운 iReport 설치로 시작하여 Hadoop 하이브 연결을 사용해야합니다. 그걸 정리해야 해.

+0

제대로 작동하지 않아 i-Report와 함께 제공되는 기본 커넥터로 시작 했으므로 커넥터를 별도로 설치하고 확인해야했습니다. 심지어 작동하지 않았다! 의견을 보내 주셔서 감사합니다. i-Report를 다시 설치하고 작동하는지 확인해 보겠습니다. – Kinjal

+1

나는 당신의 논리를 이해합니다. 그러나 jasperforge.org에 게시 된 .nbm 파일은 모두 오래되었습니다. iReport의 최신 제품은 최신 제품입니다. 실패하면 ... 문제를 게시하십시오. – mdahlman

+0

Ahh ... 하이브 -0.8.0을 사용하고있는 것을 보았습니다. 그것은 아마 문제 일 것입니다. iReport의 하이브 커넥터에는 0.7 만 포함되어 있으며, 하이브는 구형 드라이버와의 하위 호환성을 보장하지 않습니다. 해결책 : 소스를 가져 와서 업데이트 된 하이브 jar로 빌드하거나, 곧 새로운 릴리즈가 jasperforge.org에 게시 될 때까지 기다리십시오. – mdahlman

1

hadoop-common.jar의 VersionInfo 클래스가 현재 스레드의 클래스 로더를 사용하여 버전 정보를 찾으려고하기 때문에 "java.lang.RuntimeException : 잘못된 Hadoop 버전 : 알 수 없음 (A.B. * 형식)"오류가 발생합니다. 당신의 도구는 별도의 스레드에서 데이터 소스에 연결을 시도하는 경우

https://github.com/apache/hadoop/blob/release-2.6.0/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/VersionInfo.java#L41-L58

문제의 코드는 다음과 같습니다 ...

package org.apache.hadoop.util; 
... 
public class VersionInfo { 
... 
    protected VersionInfo(String component) { 
    info = new Properties(); 
    String versionInfoFile = component + "-version-info.properties"; 
    InputStream is = null; 
    try { 
     is = Thread.currentThread().getContextClassLoader() 
     .getResourceAsStream(versionInfoFile); 
     if (is == null) { 
     throw new IOException("Resource not found"); 
     } 
     info.load(is); 
    } catch (IOException ex) { 
     LogFactory.getLog(getClass()).warn("Could not read '" + 
      versionInfoFile + "', " + ex.toString(), ex); 
    } finally { 
     IOUtils.closeStream(is); 
    } 
    } 

,이 오류가 발생합니다.

문제를 해결하는 가장 쉬운 방법은 hadoop-common.jar 라이브러리를 $ JAVA_HOME/lib/ext에 넣거나 명령 행 설정 -Djava.endorsed.dirs를 사용하여 hadoop-common.jar을 가리키는 것입니다 도서관. 그러면 스레드의 클래스 로더는 항상이 정보를 찾을 수 있습니다.