Phoenix入门(上)

本文作者:林伟兵,叩丁狼高级讲师。原创文章,转载请注明出处。

1.Phoenix概述

Phoenix是一个开源的HBASE SQL层API。Phoeinx可以用标准的JDBC API替代HBASE client API来创建表,插入和查询查询HBASE中的数据。Phoenix作为应用层和HBASE之间的中间件,以下特性使它在大数据量的简单查询场景有着独有的优势:

  1. 支持二级索引.
  2. 编译SQL成为原生HBase的可并行执行的查询,并下推where过滤条件到server端的scan filter上
  3. 在数据层完成计算,server端的coprocessor执行聚合
  4. 利用统计信息优化、选择查询计划
  5. skip scan功能提高扫描速度

2.Phoenix&DBeaver安装

安装步骤如下:

  1. 不同版本的Phoenix对应不同的HBase版本,找到对应的版本下载并解压。下载地址如下:http://phoenix.apache.org/download.html
  2. 将 phoenix-[version]-server.jar 添加到HBase的各个节点的lib文件夹下。
  3. 重启 HBase.
  4. 配置Phoenix环境变量。
## PHOENIX PATH
export PHOENIX_HOME=/usr/local/phoenix
export PATH=$PATH:$PHOENIX_HOME/bin

3.Phoenix客户端实践

一般可以使用以下三种方式访问Phoenix:

  1. 使用Python编写的命令行工具(sqlline, sqlline-thin和psql等)
  2. JDBC API
  3. SQuirrel / DBeaver

3.1.命令行工具psql使用示例

psql.py主要是用来实现批量加载CSV数据的一个工具,其存放在bin目录下。用法如下:

1.创建一个建表的sql脚本文件 employee.sql:

CREATE TABLE IF NOT EXISTS t_employee (
 name VARCHAR PRIMARY KEY,
 age UNSIGNED_INT,
 gender CHAR(1),
 salary UNSIGNED_DOUBLE );

2.创建csv格式的数据文件t_employee.csv 【注意这里的文件后缀必须是csv】:

zhangsan,30,M,5600.50
lisi,35,M,4800.50
wangwu,33,M,9700.00
zhaoliu,54,M,12000.00
赵义,42,M,9200.00
郭芬芳,35,F,4200.00

3.创建一个查询sql脚本文件t_employee_queries.sql:

SELECT name as "员工姓名",gender as "性别",salary as "工资"
FROM t_employee
ORDER BY salary DESC;

4.执行psql.py工具运行sql脚本:

bin/psql.py hdp01 employee.sql t_employee.csv t_employee_queries.sql

执行结果如下:

员工姓名                                     性                                       工资 
---------------------------------------- - ---------------------------------------- 
zhaoliu                                  M                                  12000.0 
wangwu                                   M                                   9700.0 
赵义                                       M                                   9200.0 
zhangsan                                 M                                   5600.5 
lisi                                     M                                   4800.5 
郭芬芳                                      F                                   4200.0 

5.通过hbase客户端查询结果如下:

hbase(main):002:0> scan "T_EMPLOYEE"
ROW                   COLUMN+CELL                                               
 lisi                 column=0:\x00\x00\x00\x00, timestamp=1546412866119, value=
                      x                                                   
 zhangsan             column=0:\x80\x0C, timestamp=1546412866119, value=M       
 zhangsan             column=0:\x80\x0D, timestamp=1546412866119, value=@\xB5\xE
                      0\x80\x00\x00\x00\x00                                     
 zhaoliu              column=0:\x00\x00\x00\x00, timestamp=1546412866119, value=
                      x                                                         
   
 \xE8\xB5\xB5\xE4\xB9 column=0:\x80\x0B, timestamp=1546412866119, value=\x00\x00
 \x89                 \x00*                                                     
 \xE8\xB5\xB5\xE4\xB9 column=0:\x80\x0C, timestamp=1546412866119, value=M       
 \x89                                                                                   
...(省略打印结果)

6.HBase查看表结构,通过查看发现系统创建了一个列族0,并且系统默认创建了一些协处理器。如下:

hbase(main):057:0> describe 'T_EMPLOYEE'
Table T_EMPLOYEE is ENABLED                                                     
T_EMPLOYEE, {TABLE_ATTRIBUTES => {coprocessor$1 => '|org.apache.phoenix.coproces
sor.ScanRegionObserver|805306366|', coprocessor$2 => '|org.apache.phoenix.coproc
essor.UngroupedAggregateRegionObserver|805306366|', coprocessor$3 => '|org.apach
e.phoenix.coprocessor.GroupedAggregateRegionObserver|805306366|', coprocessor$4 
=> '|org.apache.phoenix.coprocessor.ServerCachingEndpointImpl|805306366|', copro
cessor$5 => '|org.apache.phoenix.hbase.index.Indexer|805306366|org.apache.hadoop
.hbase.index.codec.class=org.apache.phoenix.index.PhoenixIndexCodec,index.builde
r=org.apache.phoenix.index.PhoenixIndexBuilder'}                                
COLUMN FAMILIES DESCRIPTION                                                     
{NAME => '0', BLOOMFILTER => 'NONE', VERSIONS => '1', IN_MEMORY => 'false', KEEP
_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'FAST_DIFF', TTL => 'FOREVER',
 COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => 
'65536', REPLICATION_SCOPE => '0'}  

在PSQL批量导入数据时,为了满足更多的需求,可以使用如下参数:

参数 描述
-t 提供了需要加载数据的表名,默认情况下加载数据的表名由CSV文件名来决定。
-h 指定CSV数据映射到HBase的列名。默认情况下CSV数据会按照顺序映射到表的每个字段中。
-d 指定CSV数据的列分隔符。
-a 指定数据组的分隔符。

3.2.psql删除表的操作

Phoenix工具创建的表最好也使用Phoenix工具删除,否则会出现遗留的数据问题,操作遗留数据会会导致系统出现异常。如下介绍如何删除表:

  1. 创建删除表的sql文件 drop_employee.sql:
DROP TABLE IF EXISTS t_employee;

2.执行psql.py工具运行sql脚本:

bin/psql.py hdp01,hdp02,hdp03:2181 drop_employee.sql 

3.3.看懂Phoenix数据类型

Phoenix支持6种数据类型,大致如下:

整数型 浮点数 时间类型 字符串
INTEGER / UNSIGNED_INT FLOAT / UNSIGNED_FLOAT TIME / UNSIGNED_TIME VARCHAR
BIGINT / UNSIGNED_LONG DOUBLE / UNSIGNED_DOUBLE DATE / UNSIGNED_DATE CHAR(10)
TINYINT / UNSIGNED_TINYINT DECIMAL / DECIMAL(10,2) TIMESTAMP /UNSIGNED_TIMESTAMP BINARY / VARBINARY
SMALLINT / UNSIGNED_SMALLINT
布尔值 数组
BOOLEAN VARCHAR ARRAY
-- INTEGER [] / INTEGER [100]

对于数字类型的数据,既支持正负级别的限制,也支持对正数的限制[前缀UNSIGNED] 数据类型的使用方式如下:http://phoenix.apache.org/language/datatypes.html#char_type

对于数组的应用,使用文档:http://phoenix.apache.org/array_type.html

  1. 创建建表文件 create_tscore.sql:
CREATE TABLE IF NOT EXISTS t_score(
student VARCHAR PRIMARY KEY,
scores VARCHAR ARRAY[3] );
  1. 导入CSV文件 score.csv:
zhangsan,75-75-89
lisi,85-79-92
wangwu,90-70-91
zhaoliu,95-100-95
  1. 查询表数据文件 score_querries.sql
SELECT student,scores[1] as "math" FROM t_score;
  1. 执行psql.py工具运行sql脚本:
bin/psql.py hdp01,hdp02,hdp03:2181 -t T_SCORE -a - create_tscore.sql score.csv score_querries.sql

注意:

  1. psql.py -t 指定的表名必须大写。
  2. 数组查询时,索引是从1开始的。

3.4 命令行工具sqlline.py使用示例

可以使用bin目录下的 sqlline.py工具进入phoenix客户端。

># sqlline.py hdp01,hdp02,hdp03:2181

0: jdbc:phoenix:hdp01,hdp02,hdp03:2181> !tables
+------------+--------------+-------------+---------------+----------+---------+
| TABLE_CAT  | TABLE_SCHEM  | TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE_NA |
+------------+--------------+-------------+---------------+----------+---------+
|            | SYSTEM       | CATALOG     | SYSTEM TABLE  |          |         |
|            | SYSTEM       | FUNCTION    | SYSTEM TABLE  |          |         |
|            | SYSTEM       | LOG         | SYSTEM TABLE  |          |         |
|            | SYSTEM       | SEQUENCE    | SYSTEM TABLE  |          |         |
|            | SYSTEM       | STATS       | SYSTEM TABLE  |          |         |
|            |              | T_SCORE     | TABLE         |          |         |
+------------+--------------+-------------+---------------+----------+---------+

0: jdbc:phoenix:hdp01,hdp02,hdp03:2181> !describe t_score
+------------+--------------+-------------+--------------+------------+--------+
| TABLE_CAT  | TABLE_SCHEM  | TABLE_NAME  | COLUMN_NAME  | DATA_TYPE  |   TYPE |
+------------+--------------+-------------+--------------+------------+--------+
|            |              | T_SCORE     | STUDENT      | 12         | VARCHA |
|            |              | T_SCORE     | SCORES       | 2003       | VARCHA |
+------------+--------------+-------------+--------------+------------+--------+

0: jdbc:phoenix:hdp01,hdp02,hdp03:2181> !history
2.    1: !tables
3.    2: !describe t_score
4.    3: !history

0: jdbc:phoenix:hdp01,hdp02,hdp03:2181> !help
...
0: jdbc:phoenix:hdp01,hdp02,hdp03:2181> !set key value
...
0: jdbc:phoenix:hdp01,hdp02,hdp03:2181> !exit
>#

默认情况下phoenix不支持分组,需要打开开关。

1.停止HBase集群;
2.将如下配置信息添加到hbase-site.xml文件中【其存放在HBase的conf目录中,所有集群机器都要修改,同时还要修改phoenix/bin/hbase-site.xml文件】
        <!-- 指定启动分组功能 -->
        <property>
            <name>phoenix.schema.isNamespaceMappingEnabled</name>
            <value>true</value>
        </property>
3.启动集群。

操作数据库表分组:

CREATE SCHEMA IF NOT EXISTS wolfcode_mdb;
USE wolfcode_mdb;
DROP SCHEMA IF EXISTS wolfcode_mdb;

创建/删除分组下的表:

CREATE TABLE t_employee(id BIGINT primary key, name VARCHAR, salary UNSIGNED_DOUBLE, gender CHAR(1));

DROP TABLE wolfcode_mdb.employee;

插入数据:

UPSERT INTO t_employee(id,name,salary,gender) VALUES(1,'zhangsan',9800.00,'M');
UPSERT INTO t_employee(id,name,salary,gender) VALUES(2,'lisi',9900.00,'M');
UPSERT INTO t_employee VALUES(3,'wangwu',7500.00,'F');
UPSERT INTO t_employee VALUES(4,'zhaoliu',10000.00,'M');
UPSERT INTO t_employee VALUES(5,'张一刀',7700.00,'F');

除了上述的插入操作,还支持UPSERT SELECT批量插入操作,如下代码:
UPSERT INTO test.targetTable(col1, col2) SELECT col3, col4 FROM test.sourceTable WHERE col5 < 100;

更新数据:由于HBase的主键设计,相同rowkey的内容可以直接覆盖,这就变相的更新数据。

UPSERT INTO t_employee(id,salary) VALUES(1,10800.00);

删除数据:

DELETE FROM t_employee WHERE name LIKE '张一%';

查询数据:

SELECT * FROM t_employee LIMIT 2;
SELECT * FROM t_employee LIMIT 3 OFFSET 2;

更多Phoenix的语法官网:http://phoenix.apache.org/language/index.html

想获取更多技术干货,请前往叩丁狼官网:http://www.wolfcode.cn/all_article.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容