无法使用 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的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 JDBC 连接到 docker 中的本地 MySQL

无法使用 jdbc 连接到 MS SQL 数据库

无法使用 JDBC 连接到 Spark thriftserver

无法使用 JDBC 连接到 sql 2008 express

无法使用 JDBC 连接到远程 oracle 数据库

无法使用 JDBC 和 Spring 连接到 MySQL [重复]