Phoenix 是一个开源的 SQL 层,用于 HBase 数据库。它允许用户通过标准的 JDBC API 来创建表、插入数据和查询 HBase 数据,而无需直接使用 HBase 的客户端 API。
(此处省略图片)
官方网站:
部署步骤
bash
tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /opt/module/
mv apache-phoenix-5.0.0-HBase-2.0-bin phoenix
bash
cd /opt/module/phoenix/
cp /opt/module/phoenix/phoenix-5.0.0-HBase-2.0-server.jar /opt/module/hbase/lib/
xsync /opt/module/hbase/lib/phoenix-5.0.0-HBase-2.0-server.jar
bash
export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
bash
stop-hbase.sh
start-hbase.sh
bash
bin/sqlline.py hadoop102,hadoop103,hadoop104:2181
sql
!table 或 !tables
sql
CREATE TABLE IF NOT EXISTS student(id VARCHAR PRIMARY KEY, name VARCHAR, addr VARCHAR);
sql
CREATE TABLE IF NOT EXISTS us_population(State CHAR(2) NOT NULL, City VARCHAR NOT NULL, Population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city));
sql
UPSERT INTO student VALUES('1001', 'zhangsan', 'beijing');
sql
SELECT * FROM student;
SELECT * FROM student WHERE id='1001';
sql
DELETE FROM student WHERE id='1001';
sql
DROP TABLE student;
sql
!quit
默认情况下,在 HBase 中创建的表无法通过 Phoenix 查看。若需在 Phoenix 中操作这些表,则需要进行映射。映射分为两种类型:视图映射和表映射。
bash
create 'test', 'info1', 'info2'
sql
CREATE VIEW "test" (id VARCHAR PRIMARY KEY, "info1"."name" VARCHAR, "info2"."address" VARCHAR);
删除视图:
sql
DROP VIEW "test";
sql
CREATE TABLE "test" (id VARCHAR PRIMARY KEY, "info1"."name" VARCHAR, "info2"."address" VARCHAR) COLUMN_ENCODED_BYTES=0;
bash
queryserver.py start
xml
<dependencies>
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-queryserver-client</artifactId>
<version>5.0.0-HBase-2.0</version>
</dependency>
</dependencies>
编写代码 ```java package com.bigdata; import java.sql.*; import org.apache.phoenix.queryserver.client.ThinClientUtil;
public class PhoenixTest { public static void main(String[] args) throws SQLException { String connectionUrl = ThinClientUtil.getConnectionUrl("hadoop102", 8765); System.out.println(connectionUrl); Connection connection = DriverManager.getConnection(connectionUrl); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM student"); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { System.out.println(resultSet.getString(1) + "t" + resultSet.getString(2)); } connection.close(); } } ```
xml
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<property>
<name>hbase.region.server.rpc.scheduler.factory.class</name>
<value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
</property>
<property>
<name>hbase.rpc.controllerfactory.class</name>
<value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
</property>
全局索引是一种默认的索引格式,适用于多读少写的应用场景。创建全局索引时,会在 HBase 中创建一张新表,索引数据和原始数据分别存储在不同的表中。
sql
CREATE INDEX my_index ON my_table (my_col);
sql
CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);
本地索引适用于写操作频繁的场景。索引数据和原始数据存储在同一张表中,避免了写操作时跨服务器传输数据带来的额外开销。
sql
CREATE LOCAL INDEX my_index ON my_table (my_column);