2013-07-06 9 views
1

JDBC 클라이언트 코드를 사용하여 하이브 설치에 연결 중입니다. 두 개의 열 (column1, column2) 모두 문자열 유형으로 테스트 테이블을 만들었습니다. "select * from test"와 같은 간단한 쿼리를 실행하면 java 프로그램에서 결과를 얻지 만 절 및 기타 복잡한 쿼리는 다음 예외를 throw합니다. 내가 HDFS의 권한을 변경 시도Hive JDBC 클라이언트가 SQLException을 throw합니다.

"org.apache.hadoop.hive.ql.exec.MapRedTask에서 실행 오류, 리턴 코드 1 : 1, 원인 : 실패 쿼리가 아닌 제로 코드를 반환" 파일이있는 디렉토리, 로컬 디렉토리의/tmp이지만 작동하지 않습니다.

Connection con = DriverManager.getConnection("jdbc:hive://"+host+":"+port+"/default", "", ""); 

Statement stmt = con.createStatement(); 

오류 하는 executeQuery() 서버의 로그를 확인

는 다음과 같은 예외가 있습니다 방법 던져 내 접속 코드 :

때 java.io.IOException를 : 클러스터를 초기화 할 수 없습니다. mapreduce.framework.name과 해당 서버 주소에 대한 구성을 확인하십시오. at org.apache.hadoop.mapreduce.Cluster.initialize (Cluster.java:121) org.apache.hadoop.mapreduce.Cluster (Cluster.java:83) at org.apache.hadoop.mapreduce.Cluster . (Cluster.java:76) at org.apache.hadoop.mapred.JobClient.init (JobClient.java:478) at org.apache.hadoop.mapred.JobClient. (JobClient.java:457) at org .apache.hadoop.hive.ql.exec.ExecDriver.execute (ExecDriver.java:426) at org.apache.hadoop.hive.ql.exec.MapRedTask.execute (MapRedTask.java:138) at org.apache .hadoop.hive.ql.exec.Task.executeTask (Task.java:138) at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential (TaskRunner.java:57) at org.apache.hadoop .hive.ql.Driver.launchTask (Driver.java:1374)) at org.apache.hadoop.hive.ql.Driver.execute (Driver.java:1160) at org.apache.hadoop.hive.ql.Driver.run (Driver.java:973) at org.apache .hadoop.hive.ql.Driver.run (Driver.java:893) at org.apache.hadoop.hive.service.HiveServer $ HiveServerHandler.execute (HiveServer.java:198) at org.apache.hadoop.hive .service.ThriftHive $ 프로세서 $ execute.getResult (ThriftHive.java:644) at org.apache.hadoop.hive.service.ThriftHive $ 프로세서 $ execute.getResult (ThriftHive.java:628) at org.apache.thrift .ProcessFunction.process (ProcessFunction.java:39) (org.apache.thrift.TBaseProcessor.process) (TBaseProcessor.java:39) at org.apache.thrift.server.TThreadPoolServer $ WorkerProcess.run (TThreadPoolServer.java:206))(알 수없는 소스) 에서 작업을 제출하지 못했습니다. Worker.run (알 수없는 소스) 에서 java.lang.Thread.run (알 수없는 소스) 예외 'java.io.IOException (클러스터를 초기화 할 수 없습니다. 구성에 mapreduce.framework.name과 해당 서버 주소가 있는지 확인하십시오.) '

쿼리는 명령 프롬프트에서 실행되지만 JDBC 클라이언트에서는 실행되지 않습니다.

나는 이것에 붙어있다. 어떤 제안이라도 도움이 될 것입니다.

UPDATE 내가 CDH4의 하둡/하이브 유통 클라우 데라를 사용하고

.

#!/bin/bash 
HADOOP_HOME=/usr/lib/hadoop/client 
HIVE_HOME=/usr/lib/hive 

echo -e '1\x01foo' > /tmp/a.txt 
echo -e '2\x01bar' >> /tmp/a.txt 

HADOOP_CORE={{ls $HADOOP_HOME/hadoop*core*.jar}} 
CLASSPATH=.:$HADOOP_CORE:$HIVE_HOME/conf 

for i in ${HIVE_HOME}/lib/*.jar ; do 
    CLASSPATH=$CLASSPATH:$i 
done 

for i in ${HADOOP_HOME}/*.jar ; do 
    CLASSPATH=$CLASSPATH:$i 
done 

java -cp $CLASSPATH com.hive.test.HiveConnect 

내가 변경 한 다음과 같이 내가 실행 스크립트는 HADOOP_CORE = {{$ HADOOP_HOME/하둡 LS - * - core.jar를}}에 HADOOP_CORE = {{LS $ HADOOP_HOME/하둡 * 핵심 * .jar}} hadoop-로 시작하고 -core.jar로 끝나는 내 hadoop_home에 jar 파일이 없으므로. 이 올바른지? 또한 스크립트를 실행하면 다음과 같은 오류를 제공

/usr/lib/hadoop/client/hadoop*core*.jar}} :

이 또한 내가 하둡을 추가 할 수있는 스크립트를 수정 한 해당 파일하거나 디렉토리 스크립트가 hadoop fileReader를 찾을 수 없다는 오류를 던집니다. 그래서 나는 다음과 같이 덧붙였다. $ {HADOOP_HOME}/*. jar에있는 i의 경우 ; do CLASSPATH = $ CLASSPATH : $ i done

이 클래스 파일을 실행하고 "select * from test"쿼리를 실행하지만 "select column1 from test"는 실패합니다.

여전히 성공과 오류가 없습니다.

답변

0

하이브 셸에서 잘 실행되기 때문에 하이브 셸을 실행하는 사용자와 JDBC 프로그램을 사용하는 자바 프로그램이 같은지 확인할 수 있습니까?

다음, 하이브는 곳으로 드리프트 서버 CD 시작 -이 명령 문제 -

bin/hive --service hiveserver & 

당신이 볼 수 -

하이브 드리프트 서버를

시작을 HiveServer가 실행 중인지 확인하는 빠른 방법은 netstat 명령을 사용하여 포트 10,000이 열려 있는지 확인하고 연결을 수신 :

netstat -nl | grep 10000 
tcp 0 0 :::10000   :::*   LISTEN 

다음, 당신의 요구 사항 -

#!/bin/bash 
    HADOOP_HOME=/your/path/to/hadoop 
    HIVE_HOME=/your/path/to/hive 

    echo -e '1\x01foo' > /tmp/a.txt 
    echo -e '2\x01bar' >> /tmp/a.txt 

    HADOOP_CORE={{ls $HADOOP_HOME/hadoop-*-core.jar}} 
    CLASSPATH=.:$HADOOP_CORE:$HIVE_HOME/conf 

    for i in ${HIVE_HOME}/lib/*.jar ; do 
     CLASSPATH=$CLASSPATH:$i 
    done 

    java -cp $CLASSPATH package.youMainClass 
에 따라 HADOOP_HOME, HIVE_HOMEpackage.youMainClassmyhivetest.sh라는 파일을 생성하고 내부의 follwing을 넣어 교체

myhivetest.sh을 저장하고 chmod +x myhivetest.sh을 수행하십시오. ./myhivetest.sh을 사용하여 bash 스크립트를 실행하면 하이브 프로그램을 호출하기 전에 클래스 경로를 빌드 할 수 있습니다.

자세한 내용은 instruction here을 따르십시오. 내장 모드와 독립 모드에는 두 가지 방법이 있습니다. 독립 실행 형 모드를 찾아야합니다.당신의 내용

: 하이브 등의 MySQL, Oracle 및 테라 데이타와 같은 DBMS와 유사한 광범위한 쿼리 엔진 아니다 하이브는 매우 복잡한 등등을 조인처럼 당신이 할 수 복잡한 쿼리의 범위에 한계를 가지고있다 하이브는 쿼리를 수행 할 때 Hadoop MapReduce 작업을 실행합니다.

Check this tutorial 지원되는 쿼리 유형과 지원되지 않는 쿼리 유형.

희망이 도움이됩니다.

+0

테스트를 위해 사용하고있는 쿼리는 "select column2 from test where column1 = 'somevalue'"입니다. 이 쿼리는 map/reduce 작업을 실행하고 하이브 명령 행에서 실행할 때 결과를 반환하지만 java JDBC 클라이언트에서 실행할 때 예외를 throw합니다. 이 권한 문제 또는 종속성이 누락 되었습니까? – Raghav

+0

음, 재미있다. 다시 보자. –

+0

확인 하이브 셸을 사용하여 쿼리를 성공적으로 실행할 수 있다고 생각되면 조금 대답을 편집했습니다. –

0

나는 동일한 문제가있었습니다. 나는이 문제를 해결할 수 있었다.

/사용자 계정이 설정된 hadoop 클러스터에서 하이브 jdbc 클라이언트를 실행하면이 오류가 표시됩니다. 이와 같은 환경을 설정하면지도 축소 작업을 실행할 수있는 권한이 모두 사용 권한을 기반으로합니다.

연결 문자열이 잘못되어 map-reduce 프레임 워크에서 준비 디렉토리를 설정하고 작업을 시작할 수 없습니다.

[hasoop-cluster setup에서이 오류가 표시되는 경우] 연결 문자열을 확인하십시오. 연결 문자열

USER1 클러스터 설정에 구성된 사용자입니다
Connection con = DriverManager 
       .getConnection(
         "jdbc:hive2://cluster.xyz.com:10000/default", 
         "user1", ""); 

이 방법

Connection con = DriverManager 
       .getConnection(
         "jdbc:hive2://cluster.xyz.com:10000/default", 
         "hive", ""); 

변경을 보인다면

.

0

비슷한 문제가있었습니다. Oracle SQL Developer (http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html)와 여기에 설명 된 타사 JDBC 드라이버 (https://blogs.oracle.com/datawarehousing/entry/oracle_sql_developer_data_modeler)를 사용하여 하이브를 쿼리하려고합니다. 예, 색상을 사용하여이 작업을 수행 할 수 있지만 Oracle을 비롯한 많은 다른 데이터베이스와 상호 작용할 수 있다는 것을 알고 있으며 리치 클라이언트를 통해 내 컴퓨터에서 직접 SQL 쿼리와 간단한 보고서를 저장할 수 있다는 점이 좋습니다.

AWS의 클러스터에서 Cloudera CDH (5.4)의 최신 버전을 실행하고 있습니다.

"SELECT * FROM SAMPLE_07"과 같은 간단한 쿼리를 실행하고 결과를받을 수 있지만 "SELECT COUNT (*) FROM SAMPLE_07"을 실행하면 JDBC 오류가 발생합니다. 필자는 Hue에서 사용자를 생성하고이 사용자 정보를 Oracle SQL Developer 연결 정보 대화 상자에 입력하여이를 해결할 수있었습니다. 이 작업을 수행 한 후에 두 쿼리를 모두 실행할 수있었습니다.

단순한 SELECT 문을 실행할 수 있었고 오류가 발생하지 않았다는 점이 혼란 스러웠습니다. 예를 들어 다음과 같습니다. a) 쿼리를 실행하기 위해 시스템에 로그인 할 수 있거나 b) 티. 이상한 점은 "일종의"일은 올바른 사용자 ID없이 작동하지만 이상한 하둡 (Hadoop) 일 중 하나라고 생각합니다.