Java连接Phoenix
Phoenix JDBC Driver有两种,分别是Thick Driver。直接连接zookeeper和hbase。Thin Driver。构建在http服务之上的jdbc驱动。本文描述Thick Driver的使用方法。包含连接启用Kerberos的安全集群。连接说明根据Phoenix官网描述,使用Phoenix JDBC连接HBase集群的方法如下:Connection conn = Dri
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 Connection 和 What 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。
更多推荐
所有评论(0)