[HADOOP] Java JDBC를 통해 하이브 연결
HADOOPJava JDBC를 통해 하이브 연결
여기에서 질문은 자바에서 하이브로 연결되지만 내 것은 다릅니다.
내 하이브는 machine1에서 실행 중이고 machine2에서 실행중인 Java 서버를 사용하여 쿼리를 전달해야합니다. 하이브가 원격 쿼리를 수신 할 목적으로 JDBC 인터페이스를 가지고 있다는 것을 이해합니다. 여기에서 코드를 가져 왔습니다. - HiveServer2 클라이언트
이 기사에 쓰여진 의존성을 설치했다.
그러나 컴파일 타임에 java.lang.NoClassDefFoundError 오류가 발생했습니다. 전체 오류 :
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)
StackOverflow에서 Maven에 Hadoop API 의존성을 추가하는 것이 좋습니다. Hive Error
하이브와 연결하기 위해 클라이언트가 필요로하는 API가 왜 필요한지 이해할 수 없습니다. JDBC 드라이버가 기본 쿼리 시스템에 대해 불가지론 받아야하지 않습니까? 난 그냥 일부 SQL 쿼리를 전달해야합니까?
편집하다: Cloudera (5.3.1)를 사용하고 있는데 CDH 종속성을 추가해야한다고 생각합니다. Cloudera 인스턴스가 hadoop 2.5.0 및 HiveServer2를 실행 중입니다.
그러나 서버는 컴퓨터 1에 있습니다. 컴퓨터에서 코드는 최소한 컴파일해야하며 런타임에만 문제가 발생해야합니다.
해결법
-
==============================
1.당신이 아직이 문제를 해결하지 못했다면, 나는 그것을 풀어 줬다. 컴파일 및 실행을 위해서는 다음과 같은 종속성이 필요했습니다.
당신이 아직이 문제를 해결하지 못했다면, 나는 그것을 풀어 줬다. 컴파일 및 실행을 위해서는 다음과 같은 종속성이 필요했습니다.
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
하이브 문서는 아마도 이전 버전 / 배포본에 대해 작성되었습니다.
org.apache.hadoop.conf.Configuration을 가진 hadoop-common jar가 누락되어 예외가 발생했습니다.
희망이 도움이됩니다.
-
==============================
2.하이브 0.13에 대해 hive-jdbc 1.2.1을 사용하려고 할 때 같은 오류가 발생합니다. 다른 답변의 긴 목록과 비교합니다. 이제 우리는이 두 가지를 사용합니다 :
하이브 0.13에 대해 hive-jdbc 1.2.1을 사용하려고 할 때 같은 오류가 발생합니다. 다른 답변의 긴 목록과 비교합니다. 이제 우리는이 두 가지를 사용합니다 :
hive-jdbc-1.2.1-standalone.jar hadoop-common-2.7.1.jar
또 다른 부수적 인 메모 : '필수 입력란'client_protocol '이 설정되지 않았습니다.' 이전의 하이브에 대해 최신 jdbc를 사용할 때. 그렇다면 jdbc 버전을 1.1.0으로 변경하십시오.
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.1.0</version> <classifier>standalone</classifier> </dependency>
-
==============================
3.내 자신의 질문에 대답!
내 자신의 질문에 대답!
몇몇 히트와 트라이얼에서는 pom 파일에 다음과 같은 의존성을 추가했으며 그 이후로 CHD 5.3.1과 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>
이러한 종속성 중 일부는 필요하지 않을 수 있습니다
-
==============================
4.다른 사람들이 java를 사용하여 원격으로 HIVE 쿼리를 실행하는 데 필요한 것이 무엇인지 궁금해합니다.
다른 사람들이 java를 사용하여 원격으로 HIVE 쿼리를 실행하는 데 필요한 것이 무엇인지 궁금해합니다.
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(); } }
유일하게 필요한 의존성을 가진 pom 파일과 함께 ..
<?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>
-
==============================
5.CDH5.4.1 버전에서도 동일한 문제가 발생했습니다. 아래 코드를 사용하여 POM 파일을 업데이트했으며 저에게 효과적이었습니다.
CDH5.4.1 버전에서도 동일한 문제가 발생했습니다. 아래 코드를 사용하여 POM 파일을 업데이트했으며 저에게 효과적이었습니다.
My Hadoop 버전은 Hadoop 2.6.0-cdh5.4.1이고 Hive 버전은 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>
이 POM 업데이트로 해결했습니다.
-
==============================
6.당신이 cloudera와 함께 일하고있는 것 같아서, 나는 당신이 그들의 사이트에 가면 jdbc를 다운로드 할 수 있기 때문에 maven의 repo가 오래되었다는 것을 발견했다. https://www.cloudera.com/downloads/connectors/hive/jdbc/2-5-20.html 드라이버가 하이브에있는 것보다 더 많은 기능을 지원하는 것 같습니다. 나는 그들이 addBatch를 구현했다는 것을 알아 차렸다. 나는 그들이 maven에이 라이브러리를 가지고 있었으면 좋겠다. 어쩌면 누군가가 maven을 사용하지 못하게 할 수 있습니다.
당신이 cloudera와 함께 일하고있는 것 같아서, 나는 당신이 그들의 사이트에 가면 jdbc를 다운로드 할 수 있기 때문에 maven의 repo가 오래되었다는 것을 발견했다. https://www.cloudera.com/downloads/connectors/hive/jdbc/2-5-20.html 드라이버가 하이브에있는 것보다 더 많은 기능을 지원하는 것 같습니다. 나는 그들이 addBatch를 구현했다는 것을 알아 차렸다. 나는 그들이 maven에이 라이브러리를 가지고 있었으면 좋겠다. 어쩌면 누군가가 maven을 사용하지 못하게 할 수 있습니다.
from https://stackoverflow.com/questions/28760141/connect-hive-through-java-jdbc by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] hadoop 맵의 InstantiationException 프로그램 축소 (0) | 2019.07.21 |
---|---|
[HADOOP] hdfs : // URI를 사용할 때 NameNode HA (0) | 2019.07.21 |
[HADOOP] Spark에서 RDD 비싼 작업의 기록을 세고 있습니까? (0) | 2019.07.21 |
[HADOOP] Hadoop Java 오류 : "main"스레드의 예외 java.lang.NoClassDefFoundError : WordCount (잘못된 이름 : org / myorg / WordCount) (0) | 2019.07.21 |
[HADOOP] 스파크 스트리밍 : 마이크로 배치 병렬 실행 (0) | 2019.07.21 |