无法使用 JDBC 连接到 Phoenix

Posted

技术标签:

【中文标题】无法使用 JDBC 连接到 Phoenix【英文标题】:Unable to connect to Phoenix using JDBC 【发布时间】:2017-04-06 09:42:41 【问题描述】:

我有一个使用 HBase 和 Phoenix 设置的 Hadoop 集群,我正在尝试使用 JDBC 连接到 Phoenix,但我有点无法成功连接。

我想通过 Python 3.x 使用 JDBC 进行连接,但为了简单的测试目的,我在 Eclipse 中使用 Java 建立了连接。

我最初使用 Python 的 3rd 方库 (phoenixdb),但我开始使用这个库超时(随着我的数据库增长)。在此之后,我更改了我的 hbase-site.xml 设置中的一些变量,以避免超时,但由于某种原因,这并没有解决我使用这个 3rd 方库的问题。

所以我尝试转而使用 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!");

使用这段代码和 client.jar 似乎我更改的设置被识别为查询需要 10 分钟(600.000 毫秒 - 这是我将其从默认的 60.000 毫秒更改为之前)与使用 phoenixdb 库不同,在使用默认超时(60.000 毫秒)后关闭连接。

当我使用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 毫秒,只是为了测试哪个是用过的。使用DB_URL1 我得到以下错误:

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

我认为这意味着它找不到 IP。

但是我从来没有完全建立成功的连接,所以我希望有人能对出了什么问题提出一些建议?

【问题讨论】:

尝试使用瘦客户端驱动程序,您的 jdbc url 看起来也错误 - 尝试使用瘦客户端 - jdbc:phoenix:thin:url=localhost:8765(瘦驱动程序类 - org.apache.phoenix。查询服务器.client.Driver) 我可能忘了提到我没有将它连接到 localhost Phoenix 服务,而是一个远程服务。这就是为什么我没有在问题中写IP,而是使用xx.xx.xx.xx 的原因。使用你的方法我得到java.lang.RuntimeException: java.net.MalformedURLException: no protocol: <ip>:8765 @PaulBastide 但是如果我将 http 添加到 url 我得到java.lang.RuntimeException: org.apache.phoenix.shaded.com.fasterxml.jackson.core.JsonParseException: Unexpected character ('o' (code 111)): Expected space separating root-level values。这意味着我使用的 URL 是 jdbc:phoenix:thin:url=http://xx.xx.xx.xx:8765/,驱动程序是 org.apache.phoenix.queryserver.client.Driver 尝试在该端口上对服务器执行 curl -X POST 看看你得到了什么 您可能缺少 protobuf 声明 - 我使用的模式 - jdbc:phoenix:thin:url=http://:;serialization=PROTOBUF 【参考方案1】:

感谢@PaulBastide,我设法使用以下链接建立了连接:

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

我还使用了与 Phoenix 发行版一起找到的瘦客户端。

【讨论】:

以上是关于无法使用 JDBC 连接到 Phoenix的主要内容,如果未能解决你的问题,请参考以下文章