赞
踩
1)官网地址:http://phoenix.apache.org/
Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表,插入数据和查询HBase数据。
优点:使用简单,直接能写sql。
缺点:效率没有自己设计rowKey再使用API高,性能较差。
将安装包上传到服务器目录
解压安装包
tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /opt/module/
mv /opt/module/apache-phoenix-5.0.0-HBase-2.0-bin /opt/module/phoenix
复制server包并拷贝到各个节点Hadoop101、Hadoop102、Hadoop103
的hbase/lib
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
配置环境变量
vim /etc/profile.d/my_env.sh
添加内容
#phoenix
export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
在hbase-site.xml中添加支持二级索引的参数(如果不需要创建二级索引,不用不加)。之后分发到所有regionserver的节点上。
vim /opt/module/hbase/conf/hbase-site.xml
xsync /opt/module/hbase/conf/hbase-site.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> <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description> </property> <property> <name>hbase.rpc.controllerfactory.class</name> <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value> <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description> </property>
重启HBase
stop-hbase.sh
start-hbase.sh
连接 phoenix
/opt/module/phoenix/bin/sqlline.py hadoop101,hadoop102,hadoop103:2181
Phoenix 将 HBase 的数据模型映射到关系型模型中。
Phoenix中的主键会作为rowkey,非主键列作为普通字段。默认使用0作为列族,也可以在建表时使用 列族.列名 作为字段名,显式指定列族。
如果主键是联合主键,则会将主键字段拼接作为rowkey。
/opt/module/phoenix/bin/sqlline.py hadoop101,hadoop102,hadoop103:2181
CREATE TABLE IF NOT EXISTS student(
id VARCHAR primary key,
name VARCHAR,
addr VARCHAR);
在phoenix中,表名等会自动转换为大写,若要小写,使用双引号,如"us_population"。
CREATE TABLE IF NOT EXISTS "un_student"(
id VARCHAR primary key,
name VARCHAR,
addr VARCHAR);
# 指定多个列的联合作为RowKey
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));
注意:Phoenix中建表,会在HBase中创建一张对应的表。为了减少数据对磁盘空间的占用,Phoenix默认会对HBase中的列名做编码处理。具体规则可参考官网链接:https://phoenix.apache.org/columnencoding.html,若不想对列名编码,可在建表语句末尾加上COLUMN_ENCODED_BYTES = 0;
CREATE TABLE IF NOT EXISTS student(
id VARCHAR primary key,
name VARCHAR,
addr VARCHAR)
COLUMN_ENCODED_BYTES = 0
;
upsert执行时,判断如果主键存在就更新,不存在则执行插入。
upsert执行时,判断如果主键存在就更新,不存在则执行插入。
upsert into student values('1001','zhangsan','beijing');
select * from student;
select * from student where id='1001';
delete from student where id='1001';
drop table student;
!quit
pom依赖
<!-- 胖客户端--> <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core</artifactId> <version>5.0.0-HBase-2.0</version> <exclusions> <exclusion> <groupId>org.glassfish</groupId> <artifactId>javax.el</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.2</version> </dependency>
测试代码:
import java.sql.*; public class TestThickClient { public static void main(String[] args) throws SQLException { // 1.添加链接 String url = "jdbc:phoenix:hadoop101,hadoop102,hadoop103:2181"; // 2.获取连接 Connection connection = DriverManager.getConnection(url); // 3.编译SQL语句 PreparedStatement preparedStatement = connection.prepareStatement("select * from student"); // 4.执行语句 ResultSet resultSet = preparedStatement.executeQuery(); System.out.println("==="); // 5.输出结果 while (resultSet.next()) { System.out.println(resultSet.getString(1) + ":" + resultSet.getString(2) + ":" + resultSet.getString(3)); } // 6.关闭资源 connection.close(); } }
服务上启动hadoop101
queryserver.py start
pom文件
<!-- 瘦客户端-->
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-queryserver-client</artifactId>
<version>5.0.0-HBase-2.0</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.21.4</version>
</dependency>
测试代码
import org.apache.phoenix.queryserver.client.ThinClientUtil; import java.sql.*; public class TestThinClient { public static void main(String[] args) throws SQLException { // 1. 直接从瘦客户端获取链接 String hadoop102 = ThinClientUtil.getConnectionUrl("hadoop101", 8765); System.out.println(hadoop102); // 2. 获取连接 Connection connection = DriverManager.getConnection(hadoop102); // 3.编译SQL语句 PreparedStatement preparedStatement = connection.prepareStatement("select * from student"); // 4.执行语句 ResultSet resultSet = preparedStatement.executeQuery(); // 5.输出结果 while (resultSet.next()) { System.out.println(resultSet.getString(1) + ":" + resultSet.getString(2) + ":" + resultSet.getString(3)); } // 6.关闭资源 connection.close(); } }
创建单个字段的全局索引
CREATE INDEX my_index ON my_table (my_col);
如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。
创建携带其他字段的全局索引
CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);
CREATE LOCAL INDEX my_index ON my_table (my_column);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。