Phoenix使用指南

版权声明:本文为zjcjava原创文章,转载请注明出处http://blog.csdn.net/zjcjava https://blog.csdn.net/zjcjava/article/details/86018990

Phoenix

Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询,如果可以像操作mysql等一样通过sql实现对Hbase的操作,那么很大程度降低了Hbase的使用成本。Apache Phoenix 组件就完成了这种需求,官方注解为 “Phoenix -we put the SQL back in NoSql”,通过官方说明,Phoenix 的性能很高,相对于 hbase 原生的scan 并不会差多少,而对于类似的组件 hive、Impala等,性能有着显著的提升,详细请阅读https://phoenix.apache.org/performance.html。

Apache Phoenix 官方站点:https://phoenix.apache.org/
Phoenix支持的sql语句: https://phoenix.apache.org/language/index.html

Phoenix 支持的DataTypes:https://phoenix.apache.org/language/datatypes.html
Phoenix 支持的函数:https://phoenix.apache.org/language/functions.html

Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集,

Download:http://phoenix.apache.org/download.html

安装

下载hbase对应版本的phoenix;解压bin.tar.gz包,拷贝phoenix server jar包到hbase集群的每个region server 的lib目录下,然后重启hbase 集群

wget http://mirrors.hust.edu.cn/apache/phoenix/apache-phoenix-4.14.1-HBase-1.4/bin/apache-phoenix-4.14.1-HBase-1.4-bin.tar.gz
 
tar -zxvf apache-phoenix-4.14.1-HBase-1.4-bin.tar.gz
mv apache-phoenix-4.14.1-HBase-1.4-bin/ phoenix-1.4

拷贝phoenix-core-4.14.1-HBase-1.4.jar到RegionServer,如果有其他节点则把master和slave都需要拷
phoenix-4.14.1-HBase-1.4-server.jar 和 phoenix-core-4.14.1-HBase-1.4.jar

cd phoenix-HBase-1.4
cp phoenix-core-4.14.1-HBase-1.4.jar hbase-1.4.9/lib
cp phoenix-4.14.1-HBase-1.4-client.jar /mnt/hbase-1.4.9/lib

# 拷贝到其他节点
$scp -r phoenix-core-4.14.1-HBase-1.4.jar  [email protected]:/home/hbase-1.4.9/lib 拷贝到slave01
scp -r phoenix-4.14.1-HBase-1.4-client.jar  [email protected]:/home/hbase-1.4.9/lib 拷贝到slave01

2.3.3 重启hbase

$cd /mnt/hbase-1.4.9/bin

$./stop-hbase.sh

$./start-hbase.sh
#phoenix
export PHOENIX_HOME=/home/hadoop/app/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin

source /etc/profile

执行sql测试

./sqlline.py localhost:2181
Setting property: [incremental, false]
Setting property: [isolation, TRANSACTION_READ_COMMITTED]
issuing: !connect jdbc:phoenix:localhost:2181 none none org.apache.phoenix.jdbc.PhoenixDriver
Connecting to jdbc:phoenix:localhost:2181
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/mnt/phoenix-HBase-1.4/phoenix-4.14.1-HBase-1.4-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/mnt/hadoop-2.7.5/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
19/01/07 04:07:30 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Connected to: Phoenix (version 4.14)
Driver: PhoenixEmbeddedDriver (version 4.14)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
133/133 (100%) Done
Done
sqlline version 1.2.0
0: jdbc:phoenix:localhost:2181> !tables
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+------------+
| TABLE_CAT  | TABLE_SCHEM  | TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE_NAME  | SELF_REFERENCING_COL_NAME  | REF_GENERATION  | INDEX_STATE  | IMMUTABLE_ROWS  | SALT_BUCKE |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+------------+
|            | SYSTEM       | CATALOG     | SYSTEM TABLE  |          |            |                            |                 |              | false           | null       |
|            | SYSTEM       | FUNCTION    | SYSTEM TABLE  |          |            |                            |                 |              | false           | null       |
|            | SYSTEM       | LOG         | SYSTEM TABLE  |          |            |                            |                 |              | true            | 32         |
|            | SYSTEM       | SEQUENCE    | SYSTEM TABLE  |          |            |                            |                 |              | false           | null       |
|            | SYSTEM       | STATS       | SYSTEM TABLE  |          |            |                            |                 |              | false           | null       |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+------------+
0: jdbc:phoenix:localhost:2181>

sql操作的前提之路

如果需要在phoenix中操作直接在hbase中创建的表,则需要在phoenix中进行表的映射。映射方式有两种:

  • 视图映射: Phoenix创建的视图是只读的,所以只能用来做查询,无法通过视图对源数据进行修改等操作。而且相比于直接创建映射表,视图的查询效率会低,原因是:创建映射表的时候,Phoenix会在表中创建一些空的键值对,这些空键值对的存在可以用来提高查询效率。修改视图不会对数据源进行改变。
  • 表映射:如果对表进行了修改,源数据也会改变,同时如果关联表被删除,源表也会被删除。但是视图就不会,如果删除视图,源数据不会发生改变。

hbase命令行中创建表test

$ cd /home/hadoop/hbase/bin

$ ./hbase shell
create 'test','name','company'

下面的视图映射和表映射均基于该表。

视图映射

   1)创建视图
create table "test"(empid varchar primary key,"name"."firstname"varchar,"name"."lastname"varchar,"company"."name" varchar,"company"."address"varchar);

按照family.cloum的方式创建表结构语句

   2)删除视图
  drop view "test";

表映射

使用Apache Phoenix创建对HBase的表映射,有两种方法:

1) 当HBase中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view改为create table即可。

2)当HBase中不存在表时,可以直接使用create table指令创建需要的表,并且在创建指令中可以根据需要对HBase表结构进行显示的说明。

第1)种情况下,如在之前的基础上已经存在了test表,则表映射的语句如下:

create table "bamboo"(empid varchar primarykey,"name"."firstname"varchar,"name"."lastname"varchar,"company"."name" varchar,"company"."address"varchar);

# hbase 可以看到该表
hbase(main):001:0> list                                                                                                                                                                     
bamboo            

 第2)种情况下,直接使用与第1)种情况一样的create table语句进行创建即可,这样系统将会自动在Phoenix和HBase中创建person_infomation的表,并会根据指令内的参数对表结构进行初始化。

使用create table创建的关联表,如果对表进行了修改,源数据也会改变,同时如果关联表被删除,源表也会被删除。但是视图就不会,如果删除视图,源数据不会发生改变。

常用sql


# 进入命令行
./sqlline.py localhost:2181


# 创建表

create table "bamboo"(empid varchar primarykey,"name"."firstname"varchar,"name"."lastname"varchar,"company"."name" varchar,"company"."address"varchar);


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中,默认情况下,表名等会自动转换为大写,若要小写,使用双引号,如"us_population"。


# 显示所有表
  !table
       或
       !tables

# 插入记录
      upsert into us_population values('NY','NewYork',8143197);
      upsert into us_population values('BJ','BeiJing',9143197);
      upsert into us_population values('SH','ShangHai',9143198);
      upsert into us_population values('TY','TokYou',8043198);


#查询记录
select * from us_population ;
+--------+-----------+-------------+
| STATE  |   CITY    | POPULATION  |
+--------+-----------+-------------+
| BJ     | BeiJing   | 9143197     |
| NY     | NewYork   | 8143197     |
| SH     | ShangHai  | 9143198     |
| TY     | TokYou    | 8043198     |
+--------+-----------+-------------+

select * from us_population where state='NY';

# 删除记录:
 
delete from us_population where state='NY';


# alter:可添加或删除一列或更新表属性。被移除的列,其上数据会被删除。如果该列是主键,不能被移除,如果移除列的是一个视图,数据是不会受影响的。

 ALTER TABLE us_population ADD area varchar(50);

 upsert into us_population values('SZ','ShenZhen',443198,'20000');#插入一条数据
  select * from us_population ;
+--------+-----------+-------------+--------+
| STATE  |   CITY    | POPULATION  |  AREA  |
+--------+-----------+-------------+--------+
| BJ     | BeiJing   | 9143197     |        |
| SH     | ShangHai  | 9143198     |        |
| SZ     | ShenZhen  | 443198      | 20000  |
| TY     | TokYou    | 8043198     |        |
+--------+-----------+-------------+--------+


ALTER TABLE us_population DROP COLUMN area;#删除area列后ShenZhen的area值将丢失

ALTER TABLE us_population SET IMMUTABLE_ROWS=true#

 


#  删除表:如果删除表,表中数据也会被删除,如果是视图则不受影响
DROP TABLE "us_population";

#  退出命令行
      !quit


具体语法参照官网

https://phoenix.apache.org/language/index.html#upsert_select

java链接到phoenix客户端

pom

  <dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version>4.10.0-HBase-1.2</version>
</dependency>

java

package com.epoint.test.phoenix;

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

public class Phoenix {
    private static String driver = "org.apache.phoenix.jdbc.PhoenixDriver";

    public static void main(String[] args) throws SQLException {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Statement stmt = null;
        ResultSet rs = null;

        Connection con = DriverManager.getConnection("jdbc:phoenix:hadoop0,hadoop1,hadoop2:2181");
        stmt = con.createStatement();
        String sql = "select * from test";
        rs = stmt.executeQuery(sql);
        while (rs.next()) {
            System.out.print("id:"+rs.getString("id"));
            System.out.println(",name:"+rs.getString("name"));
        }
        stmt.close();
        con.close();
    }
}

视图界面SQuirrel使用

如果希望通过客户端以图形化的界面操作Phoenix的话,可以下载并安装SQuirrel。

SQuirrel SQL Client是一个用Java写的数据库客户端,可以通过一个统一的用户界面来操作MySQL 、PostgreSQL 、MSSQL、 Oracle等任何支持JDBC访问的数据库。使用起来非常方便。

SQuirrel下载页面:http://squirrel-sql.sourceforge.net/#installation。

SQuirrel的安装步骤(参考https://phoenix.apache.org/installation.html):

1)移除SQuirrel的lib文件夹下的phoenix-[oldversion]-client.jar(如果有的话),然后拷贝phoenix-[newversion]-client.jar到SQuirrel的lib文件夹下,phoenix-[newversion]-client.jar须与欲连接的hbase的lib下的phoenix版本一致。

2)windows下,运行squirrel-sql.bat启动SQuirrel,在启动界面下,切换到Drivers选项卡,点击+号添加新的驱动。

3)在添加驱动对话框中,设置name为Phoenix,设置Example URL为 jdbc:phoenix:localhost,其中的localhost为hbase使用的Zookeeper主机名。

4)设置Class Name文本框的内容为 “org.apache.phoenix.jdbc.PhoenixDriver”, 如图4.1,然后点击“OK”关闭。

5)切换到Aliases选项卡,点击+新建一个alias。

6)在对话框中,name:任何名称,Driver:选择phoenix,username、password可省略,或者填任意值均可。

7)URL的内容为:jdbc:phoenix: zookeeperquorum server,例如,要连接本机的hbase,URL为:jdbc:phoenix:localhost,如图4.2。

8)点击Test,在新对话框中选择connect,如果一切设置正确的话,应该连接成功,然后点击OK关闭对话框。

9)双击新建的phoenix alias,点击connect,然后就可以通过phoenix的sql语句操作hbase了,如图4.3。

参考资料

单机安装
https://blog.csdn.net/xerjava/article/details/79072290

集群安装
https://www.cnblogs.com/zlslch/p/7096353.html

猜你喜欢

转载自blog.csdn.net/zjcjava/article/details/86018990