Phoenix JDBC Driver有两种,分别是

  • Thick Driver。直接连接zookeeper和hbase,包名 phoenix-<version>-client.jar

  • Thin Driver。构建在http服务之上的jdbc驱动,包名 phoenix-<version>-thin-client.jar

本文描述Thick Driver的使用方法。包含连接启用Kerberos的安全集群。

以Phoenix-5.0.0-cdh6.2.0 为例。

连接说明

phoenix-5.0.0-cdh6.2.0-client.jar放入工程依赖库。

根据Phoenix官网描述,使用Phoenix JDBC连接HBase集群的方法如下:

Connection conn = DriverManager.getConnection("jdbc:phoenix:server1,server2:3333",props);

其中 props是可选的,用来配置Phoenix和HBase的配置属性。
props 配置示例:

Properties props = new Properties();
props.setProperty("phoenix.schema.isNamespaceMappingEnabled", "true");
props.setProperty("phoenix.schema.mapSystemTablesToNamespace", "true");

另一种配置方式是,将目标环境的hbase-site.xml, core-site.xml, hdfs-site.xml配置文件放到classpath中,被应用程序加载。在IDE中开发时,可以放到resources目录下。

Phoenix JDBC URL语法如下:

jdbc:phoenix [ :<zookeeper quorum> [ :<port number> [ :<root node> [ :<principal> [ :<keytab file> ] ] ] ] ]

更多内容请参考 Phoenix ConnectionWhat is the Phoenix JDBC URL syntax?

连接示例

phoenix-5.0.0-cdh6.2.0-client.jar放入工程依赖库。

下载目标集群的客户端配置,将hbase-site.xml, core-site.xml, hdfs-site.xml配置文件放到工程的resources目录下。

下文描述了三种集群连接方式示例:

  • 连接非安全集群-无认证无权限管理

  • 连接非安全集群-无认证有权限管理

  • 连接安全集群

选择合适的示例,按照代码,调整连接属性即可。

连接非安全集群

无认证无权限管理

此环境下,可以直接访问集群。

示例代码:

package com.example.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class PhoenixConn {

    public static Connection getConn(String url) {
        Connection conn = null;
        try {
            Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
            conn = DriverManager.getConnection(url);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        return conn;
    }

    public static void main(String[] args) {
        String url = "jdbc:phoenix:transfer01.bigdata.zxxk.com:2199:/hbase";
        try {
            Connection conn = PhoenixConn.getConn(url);

            Statement stmt = null;
            ResultSet rs = null;

            stmt = conn.createStatement();
            String sql = "select * from web_stat limit 10";
            rs = stmt.executeQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getString(1));
            }
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

无认证有权限管理

此环境下,可以直接访问集群,默认使用程序执行用户的权限,可以创建远程用户,以使用该远程用户的权限。

示例代码:

package com.example.jdbc;

import org.apache.hadoop.security.UserGroupInformation;
import java.security.PrivilegedAction;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class PhoenixConn {

    public static Connection getConn(String url) {
        Connection conn = null;
        try {
            Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
            conn = DriverManager.getConnection(url);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        return conn;
    }

    public static void main(String[] args) {
        String url = "jdbc:phoenix:transfer01.bigdata.zxxk.com:2181:/hbase";
        // 创建远程用户
        UserGroupInformation ugi = UserGroupInformation.createRemoteUser("xingweidong");
		// 使用远程用户身份访问
        ugi.doAs(new PrivilegedAction<Void>() {
            public Void run() {
                try {
                    Connection conn = PhoenixConn.getConn(url);

                    Statement stmt = null;
                    ResultSet rs = null;

                    stmt = conn.createStatement();
                    String sql = "select * from web_stat limit 10";
                    rs = stmt.executeQuery(sql);
                    while (rs.next()) {
                        System.out.println(rs.getString(1));
                    }
                    stmt.close();
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        });
    }
}

连接安全集群

安全集群同时启用了认证和权限管理。

此环境需要进行Kerberos认证,才可以访问集群,用户权限使用Kerberos用户主体的权限。

示例代码:

package com.example.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class PhoenixSecureConn {

    public static Connection getKrbConn(String krb5Conf, String url) {
        // 设置krb5.conf属性
        System.setProperty("java.security.krb5.conf", krb5Conf);
        Connection conn = null;
        try {
            Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
            conn = DriverManager.getConnection(url);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        return conn;
    }

    public static void main(String[] args) throws SQLException {
        // 指定krb5.conf文件路径
        String krb5Conf = "/home/xwd/ws/cluster_client_conf/dev/krb/krb5.conf";
        // 在jdbc url中指定Kerberos用户主体和用户keytab
        String url = "jdbc:phoenix:master1.bigdata.zxxk.com:2181:/hbase:xingweidong@BIGDATA.ZXXK.COM:/home/xwd/ws/cluster_client_conf/dev/krb/xingweidong.keytab";
        Connection conn = PhoenixSecureConn.getKrbConn(krb5Conf, url);

        Statement stmt = null;
        ResultSet rs = null;

        stmt = conn.createStatement();
        String sql = "select * from US_POPULATION limit 10";
        rs = stmt.executeQuery(sql);
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }
        stmt.close();
        conn.close();
    }
}

另一种连接安全集群的方法可参考:Java连接安全集群Impala

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐