2017-04-06 16 views
0

HBaseとPhoenixでHadoopクラスタを設定していて、JDBCを使用してPhoenixに接続しようとしていますが、接続が正常にできません。JDBCを使用してPhoenixに接続できません

私はPython 3.xを使用して接続するためにJDBCを使いたいのですが、簡単なテスト目的のためにEclipseでJavaを使用して接続を設定します。

私は当初、第三者のライブラリ(phoenixdb)をPythonに使用していましたが、このライブラリを使用してタイムアウトを開始しました(データベースが大きくなるにつれて)。この後、私は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を使用すると、私は次のエラーを取得する:600.000ミリの私のタイムアウト時間と一致していない

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 

。しかし、DB_URL1を使用している場合は、client.jarと、.jar(hbase-default.xml)の内部に設定したタイムアウト時間(300.000ミリ秒に設定したタイムアウト時間)を使用しているように見えます。 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(シンドライバクラス - org.apache.phoenix.queryserver .client.Driver) –

+0

私はローカルホストの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'(コード111)):ルートレベルの値を区切るスペース。これは、私が使用したURLが 'jdbc:phoenix:thin:url = http://xx.xx.xx.xx:8765 /'であり、ドライバが 'org.apache.phoenix.queryserver.client 'であることを意味します。Driver' – Zeliax

答えて

0

おかげで、私は次のリンクを使用して接続を取得するために管理:

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

は、私はまた、フェニックスの分布と一緒に見つかったシンクライアントを使用していました。

関連する問題