2017-04-06 90 views
0

我有一個使用HBase和Phoenix設置的Hadoop集羣,我嘗試使用JDBC連接到Phoenix,但我無法獲得成功的連接。無法使用JDBC連接到Phoenix

我想使用JDBC來使用Python 3.x進行連接,但爲了簡單的測試目的,我在Eclipse中使用Java建立了一個連接。

我最初使用Python的第三方庫(phoenixdb),但我開始使用這個庫超時(隨着我的數據庫的增長)。在此之後,我更改了我的hbase-site.xml的設置中的一些變量,以避免超時,但由於某些原因未能解決使用此第三方庫時遇到的問題。

所以我試着轉而使用JDBC和Java項目 - 至少在測試中。

我有以下的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)後關閉連接)不同。

當我使用DB_URL2我得到以下錯誤:

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毫秒我的超時時間。但是,當使用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。

但是我從來沒有完全獲得過成功的連接,所以我希望有人會對發生了什麼問題有一些建議?

+1

嘗試使用瘦客戶端驅動程序,您的jdbc url看起來不正確 - 嘗試使用瘦 - jdbc:phoenix:thin:url = http:// localhost:8765(thin driver class - org.apache.phoenix.queryserver .client.Driver) –

+0

我可能忘記提及我沒有將它連接到本地主機鳳凰服務,而是一個遠程服務。這就是爲什麼我沒有在問題中編寫IP的原因,而是使用了'xx.xx.xx.xx'。使用你的方法我得到'java.lang.RuntimeException:java.net.MalformedURLException:沒有協議::8765' – Zeliax

+0

@PaulBastide但是,如果我添加__http__到URL我得到'java.lang.RuntimeException:org.apache.phoenix .shaded.com.fasterxml.jackson.core.JsonParseException:意外字符('o'(代碼111)):期望的空間分隔根級值。這意味着我使用的URL是'jdbc:phoenix:thin:url = http://xx.xx.xx.xx:8765 /',驅動程序是'org.apache.phoenix.queryserver.client。驅動程序' – Zeliax

回答

0

感謝@PaulBastide我設法使用下列鏈接來獲取連接:

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

我也採用了與鳳凰分佈一起發現的瘦客戶機。