2017-04-06 1 views
0

HBase 및 Phoenix로 설정된 Hadoop 클러스터가 있고 JDBC를 사용하여 Phoenix에 연결하려고하고 있지만 성공적으로 연결할 수 없습니다.JDBC를 사용하여 Phoenix에 연결할 수 없습니다.

Python 3.x를 사용하여 연결하는 데 JDBC를 사용하고 싶지만 간단한 테스트 목적으로 Eclipse에서 Java를 사용하여 연결을 설정합니다.

원래 파이썬 용 타사 라이브러리 (phoenixdb)를 사용하고 있었지만이 라이브러리를 사용하여 시간 초과가 발생했습니다 (데이터베이스가 커짐에 따라). 이 후 내 hbase-site.xml의 설정에서 일부 변수를 변경하여 제한 시간을 피했지만이 제 3 자 라이브러리를 사용하여 문제를 해결하지 못했습니다.

그래서 나는 적어도 테스트를 위해 JDBC와 Java 프로젝트로 이동하려고했습니다.

나는 다음과 같은 자바 코드를 가지고 :

public class PhoenixTest { 

    static final String JDBC_DRIVER = "org.apache.phoenix.jdbc.PhoenixDriver"; 
    static final String DB_URL1 = "jdbc:phoenix:https://xx.xx.xx.xx:8765/"; 
    static final String DB_URL2 = "jdbc:phoenix:xx.xx.xx.xx:8765/"; 

    public static void main(String[] args) { 
     Connection conn = null; 
     Statement st = null; 

     try { 
      Class.forName("org.apache.phoenix.jdbc.PhoenixDriver"); 

      System.out.println("Connecting to database.."); 

      conn = DriverManager.getConnection(DB_URL); 
      st = conn.createStatement(); 

      st.close(); 
      conn.close(); 

     } catch (SQLException se) { 
      se.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (st != null) 
        st.close(); 
      } catch (SQLException se2) { 
      } 
      try { 
       if (conn != null) 
        conn.close(); 
      } catch (SQLException se) { 
       se.printStackTrace(); 
      } 
     } 
    } 
    System.out.println("Finished!"); 
} 

그리고이 코드 조각과 내가 변경 한 설정이 쿼리 10 분 (600.000 밀리 복용으로 인식되고 있다는 것을 보인다 client.jar가와

- 기본 시간 제한 (60.000 ms)을 사용한 후에 연결이 닫히는 phoenixdb 라이브러리 사용과 달리 연결이 닫히기 전에 기본 60.000 ms에서 변경되었습니다.

java.sql.SQLException: org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions: 
Thu Apr 06 11:13:35 CEST 2017, null, java.net.SocketTimeoutException: callTimeout=60000, callDuration=80236: row 'SYSTEM:CATALOG,,' on table 'hbase:meta' at region=hbase:meta,,1.1588230740, hostname=hadoopslave,16020,1490706604328, seqNum=0 

600.000 MS의 내 타임 아웃 시간과 일치하지 않습니다 내가 DB_URL2를 사용하는 경우

나는 다음과 같은 오류가 발생합니다. 그러나 DB_URL1을 사용하는 경우 client.jar.jar (hbase-default.xml) 내에 설정 한 시간 초과 시간 (300.000 ms로 설정 됨)을 사용하는 것으로 보입니다. 어느 것이 사용되는지 테스트하기 위해서입니다. DB_URL1 사용하여 나는 다음과 같은 오류가 발생합니다 : 내가 생각

java.sql.SQLException: org.apache.hadoop.hbase.client.RetriesExhaustedException: Can't get the locations 

가이 IP를 찾을 수 있다는 것을 의미한다.

그러나 나는 성공적인 연결을 결코 얻지 못했기 때문에 어떤 사람이 잘못 될지에 대한 제안을 누군가가 원했을 것입니다. @PaulBastide에

+1

씬 클라이언트 드라이버를 사용해보십시오. 또한 jdbc URL이 잘못되었습니다. thin-jdbc로 시도하십시오. phoenix : thin : url = http : // localhost : 8765 (thin 드라이버 클래스 - org.apache.phoenix.queryserver .client.Driver) –

+0

필자는 localhost Phoenix 서비스에 연결하지 않고 원격 서비스를 연결한다는 사실을 잊어 버렸을 것입니다. 이 질문에 IP를 쓰지 않았지만 대신'xx.xx.xx.xx '를 사용했습니다. 귀하의 메서드를 사용하여'java.lang.RuntimeException 얻을 : java.net.MalformedURLException : 프로토콜 없음 : : 8765' – Zeliax

+0

@ PaulBastide하지만 URL에 __http__를 추가하면'java.lang.RuntimeException : org.apache.phoenix .shaded.com.fasterxml.jackson.core.JsonParseException : 예상치 못한 문자 ('o'(code 111)) : 예상되는 공백 값의 간격'. 이것은 내가 사용한 URL이'jdbc : phoenix : thin : url = http : //xx.xx.xx.xx : 8765 /'이고 드라이버가'org.apache.phoenix.queryserver.client '임을 의미합니다.드라이버 ' – Zeliax

답변

0

덕분에 나는 다음과 같은 링크를 사용하여 연결을 얻을 수 있었다 :

jdbc:phoenix:thin:url=http://<query_server>:<port>;serializa‌​tion=PROTOBUF 

은 또한 피닉스 배포와 함께있는 씬 클라이언트를 사용했다.

관련 문제