Phoenix JDBC 使用教程
更新时间:2026-07-21
功能概述
Apache Phoenix 是构建在 HBase 之上的 SQL 引擎,允许开发者使用标准的 JDBC API 和 SQL 语句来操作 HBase 中的数据,从而降低 HBase 的使用门槛。
需要特别注意的一点:Phoenix 使用 UPSERT 语句写入数据,而非标准 SQL 的 INSERT。
前提条件
- 已创建 HBase 类型集群,且集群版本为 BMR HBase 2.4.18 及以上。创建集群详情请参考创建集群。
- 已获取集群 Master 节点的登录方式(内网 IP、绑定 EIP 或 VNC 控制台登录),SSH 登录方式请参考SSH连接到集群。
-
本地代码编译环境
- JDK 1.8 及以上
- Maven 构建工具
- 可连通集群 Zookeeper 节点(默认端口
2181)的网络环境
一、新建 Maven 工程
在目标目录下运行以下命令创建 Maven 项目:
Shell
1mvn archetype:generate -DgroupId=$yourgroupID -DartifactId=$yourartifactID -DarchetypeArtifactId=maven-archetype-quickstart
参数说明:
$yourgroupID:包名(groupId)$yourartifactID:项目名称(artifactId)maven-archetype-quickstart:表示创建标准 Maven Java 项目
生成的工程结构中,重点关注:
- 根目录下的
pom.xml:依赖与打包配置 src/main/java:源码目录
二、添加 Phoenix 依赖
编辑 pom.xml,添加 Phoenix 相关依赖。版本需与集群保持一致,这里使用 5.1.2。
2.1 properties 与 dependencies
XML
1<properties>
2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3 <phoenix.version>5.2.1</phoenix.version>
4</properties>
5
6<dependencies>
7 <dependency>
8 <groupId>org.apache.phoenix</groupId>
9 <artifactId>phoenix-hbase-compat-2.4.1</artifactId>
10 <version>${phoenix.version}</version>
11 </dependency>
12 <dependency>
13 <groupId>org.apache.logging.log4j</groupId>
14 <artifactId>log4j-1.2-api</artifactId>
15 <version>2.20.0</version>
16 </dependency>
17</dependencies>
2.2 打包配置(build 部分)
使用 maven-assembly-plugin 将依赖一起打入 jar 包,便于在集群节点上直接运行。
XML
1<build>
2 <plugins>
3 <plugin>
4 <groupId>org.apache.maven.plugins</groupId>
5 <artifactId>maven-compiler-plugin</artifactId>
6 <configuration>
7 <source>1.8</source>
8 <target>1.8</target>
9 <encoding>utf-8</encoding>
10 </configuration>
11 </plugin>
12 <plugin>
13 <artifactId>maven-assembly-plugin</artifactId>
14 <configuration>
15 <descriptorRefs>
16 <descriptorRef>jar-with-dependencies</descriptorRef>
17 </descriptorRefs>
18 </configuration>
19 <executions>
20 <execution>
21 <id>make-assembly</id>
22 <phase>package</phase>
23 <goals>
24 <goal>single</goal>
25 </goals>
26 </execution>
27 </executions>
28 </plugin>
29 </plugins>
30</build>
三、JDBC 连接字符串格式
Phoenix JDBC 连接 URL 的组成如下:
Plain Text
1jdbc:phoenix:<zk_ip1>,<zk_ip2>,<zk_ip3>:2181:<znodeParent>
参数说明,可从 BMR 集群 Master 节点 /opt/bmr/hbase/conf/hbase-site.xml 配置文件中获取
| 参数 | 说明 |
|---|---|
zk_ip1、zk_ip2、zk_ip3 |
Zookeeper 节点的内网 IP,对应 HBase 配置文件 hbase-site.xml 中 hbase.zookeeper.quorum 参数的值 |
2181 |
Zookeeper 默认监听端口 |
znodeParent |
对应 HBase 配置文件 hbase-site.xml 中 zookeeper.znode.parent 参数的值 |
驱动类为:org.apache.phoenix.jdbc.PhoenixDriver
四、编写示例代码
在 src/main/java 下创建类,示例演示了:注册驱动、创建连接、建表、插入(UPSERT)数据、查询数据。
Java
1package Phoenix;
2
3import java.sql.Connection;
4import java.sql.DriverManager;
5import java.sql.ResultSet;
6import java.sql.SQLException;
7import java.sql.Statement;
8
9public class PhoenixJdbc {
10
11 // 静态代码块中注册 Phoenix JDBC 驱动
12 static {
13 try {
14 Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
15 } catch (ClassNotFoundException e) {
16 e.printStackTrace();
17 }
18 }
19
20 public static void main(String[] args) {
21 String createSql = "create table if not exists user_tb("
22 + "id VARCHAR,"
23 + "uname VARCHAR "
24 + "CONSTRAINT pk PRIMARY KEY (id))";
25
26 Connection connection = null;
27 try {
28 // 拼接连接字符串:jdbc:phoenix:<zk节点>:2181:<znodeParent>
29 String ipList = "${zk_ip1},${zk_ip2},${zk_ip3}:2181";
30 String znodeParent = "${znodeParent}";
31 String url = "jdbc:phoenix:" + ipList + ":" + znodeParent;
32
33 connection = DriverManager.getConnection(url);
34 Statement statement = connection.createStatement();
35
36 // 建表
37 statement.executeUpdate(createSql);
38
39 // 插入数据:注意 Phoenix 使用 upsert 而非 insert
40 statement.executeUpdate("upsert into user_tb values ('1','张三')");
41 statement.executeUpdate("upsert into user_tb values ('2','李四')");
42
43 // DML 操作后需要提交事务
44 connection.commit();
45
46 // 查询数据
47 ResultSet rs = statement.executeQuery("select * from user_tb");
48 while (rs.next()) {
49 System.out.println(rs.getString("id") + "\t" + rs.getString("uname"));
50 }
51
52 rs.close();
53 statement.close();
54 } catch (SQLException throwables) {
55 throwables.printStackTrace();
56 } finally {
57 if (connection != null) {
58 try {
59 connection.close();
60 } catch (SQLException e) {
61 e.printStackTrace();
62 }
63 }
64 }
65 }
66}
关键操作说明:
- 建表:
create table if not exists user_tb(...) - 主键:通过
CONSTRAINT pk PRIMARY KEY (id)指定 - 插入数据:Phoenix 使用
upsert into,语义为「存在则更新,不存在则插入」 - 提交事务:执行 DML 后需调用
connection.commit() - 查询数据:使用标准
statement.executeQuery("select * from user_tb")
五、编译打包与上传
5.1 编译打包
Shell
1mvn package
打包成功后,会在 target 目录下生成带依赖的 jar 包(*-jar-with-dependencies.jar)。
5.2 上传到集群节点
将 jar 包上传到 BMR 集群的 Master 节点(同 VPC 拷贝/绑定公网 IP/Bos 上传下载等方式)
Shell
1scp $localfile root@公网IP地址:$remotefolder
六、运行样例
登录 EMR 集群的 HBase 节点(建议使用 Master 节点,可通过 WebShell 登录),切换到 hadoop 用户后,进入 jar 包所在目录运行:
Shell
1su hadoop
2java -cp "/opt/bmr/hbase/conf/hbase-site.xml:$jar包名" $类全限定名
参数说明:
$jar包名:上传的 jar 包名称$类全限定名:包含 main 方法的类的全限定名,即package.mainclass(本例为Phoenix.PhoenixJdbc)
评价此篇文章
