本文作者:林偉兵纲辽,叩丁狼高級講師。原創(chuàng)文章令宿,轉載請注明出處楣号。
1.Phoenix概述
Phoenix是一個開源的HBASE SQL層API最易。Phoeinx可以用標準的JDBC API替代HBASE client API來創(chuàng)建表,插入和查詢查詢HBASE中的數(shù)據炫狱。Phoenix作為應用層和HBASE之間的中間件,以下特性使它在大數(shù)據量的簡單查詢場景有著獨有的優(yōu)勢:
- 支持二級索引.
- 編譯SQL成為原生HBase的可并行執(zhí)行的查詢藻懒,并下推where過濾條件到server端的scan filter上
- 在數(shù)據層完成計算,server端的coprocessor執(zhí)行聚合
- 利用統(tǒng)計信息優(yōu)化视译、選擇查詢計劃
- skip scan功能提高掃描速度
2.Phoenix&DBeaver安裝
安裝步驟如下:
- 不同版本的Phoenix對應不同的HBase版本嬉荆,找到對應的版本下載并解壓。下載地址如下:http://phoenix.apache.org/download.html
- 將 phoenix-[version]-server.jar 添加到HBase的各個節(jié)點的lib文件夾下酷含。
- 重啟 HBase.
- 配置Phoenix環(huán)境變量鄙早。
## PHOENIX PATH
export PHOENIX_HOME=/usr/local/phoenix
export PATH=$PATH:$PHOENIX_HOME/bin
3.Phoenix客戶端實踐
一般可以使用以下三種方式訪問Phoenix:
- 使用Python編寫的命令行工具(sqlline, sqlline-thin和psql等)
- JDBC API
- SQuirrel / DBeaver
3.1.命令行工具psql使用示例
psql.py主要是用來實現(xiàn)批量加載CSV數(shù)據的一個工具,其存放在bin目錄下椅亚。用法如下:
1.創(chuàng)建一個建表的sql腳本文件 employee.sql:
CREATE TABLE IF NOT EXISTS t_employee (
name VARCHAR PRIMARY KEY,
age UNSIGNED_INT,
gender CHAR(1),
salary UNSIGNED_DOUBLE );
2.創(chuàng)建csv格式的數(shù)據文件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.創(chuàng)建一個查詢sql腳本文件t_employee_queries.sql:
SELECT name as "員工姓名",gender as "性別",salary as "工資"
FROM t_employee
ORDER BY salary DESC;
4.執(zhí)行psql.py工具運行sql腳本:
bin/psql.py hdp01 employee.sql t_employee.csv t_employee_queries.sql
執(zhí)行結果如下:
員工姓名 性 工資
---------------------------------------- - ----------------------------------------
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查看表結構限番,通過查看發(fā)現(xiàn)系統(tǒng)創(chuàng)建了一個列族0,并且系統(tǒng)默認創(chuàng)建了一些協(xié)處理器呀舔。如下:
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批量導入數(shù)據時弥虐,為了滿足更多的需求,可以使用如下參數(shù):
參數(shù) | 描述 |
---|---|
-t | 提供了需要加載數(shù)據的表名媚赖,默認情況下加載數(shù)據的表名由CSV文件名來決定霜瘪。 |
-h | 指定CSV數(shù)據映射到HBase的列名。默認情況下CSV數(shù)據會按照順序映射到表的每個字段中惧磺。 |
-d | 指定CSV數(shù)據的列分隔符颖对。 |
-a | 指定數(shù)據組的分隔符。 |
3.2.psql刪除表的操作
Phoenix工具創(chuàng)建的表最好也使用Phoenix工具刪除磨隘,否則會出現(xiàn)遺留的數(shù)據問題惜互,操作遺留數(shù)據會會導致系統(tǒng)出現(xiàn)異常布讹。如下介紹如何刪除表:
- 創(chuàng)建刪除表的sql文件 drop_employee.sql:
DROP TABLE IF EXISTS t_employee;
2.執(zhí)行psql.py工具運行sql腳本:
bin/psql.py hdp01,hdp02,hdp03:2181 drop_employee.sql
3.3.看懂Phoenix數(shù)據類型
Phoenix支持6種數(shù)據類型,大致如下:
整數(shù)型 | 浮點數(shù) | 時間類型 | 字符串 |
---|---|---|---|
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 |
布爾值 | 數(shù)組 |
---|---|
BOOLEAN | VARCHAR ARRAY |
-- | INTEGER [] / INTEGER [100] |
對于數(shù)字類型的數(shù)據训堆,既支持正負級別的限制,也支持對正數(shù)的限制[前綴UNSIGNED] 數(shù)據類型的使用方式如下:http://phoenix.apache.org/language/datatypes.html#char_type
對于數(shù)組的應用白嘁,使用文檔:http://phoenix.apache.org/array_type.html
- 創(chuàng)建建表文件 create_tscore.sql:
CREATE TABLE IF NOT EXISTS t_score(
student VARCHAR PRIMARY KEY,
scores VARCHAR ARRAY[3] );
- 導入CSV文件 score.csv:
zhangsan,75-75-89
lisi,85-79-92
wangwu,90-70-91
zhaoliu,95-100-95
- 查詢表數(shù)據文件 score_querries.sql
SELECT student,scores[1] as "math" FROM t_score;
- 執(zhí)行psql.py工具運行sql腳本:
bin/psql.py hdp01,hdp02,hdp03:2181 -t T_SCORE -a - create_tscore.sql score.csv score_querries.sql
注意:
- psql.py -t 指定的表名必須大寫坑鱼。
- 數(shù)組查詢時,索引是從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.啟動集群允扇。
操作數(shù)據庫表分組:
CREATE SCHEMA IF NOT EXISTS wolfcode_mdb;
USE wolfcode_mdb;
DROP SCHEMA IF EXISTS wolfcode_mdb;
創(chuàng)建/刪除分組下的表:
CREATE TABLE t_employee(id BIGINT primary key, name VARCHAR, salary UNSIGNED_DOUBLE, gender CHAR(1));
DROP TABLE wolfcode_mdb.employee;
插入數(shù)據:
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;
更新數(shù)據:由于HBase的主鍵設計考润,相同rowkey的內容可以直接覆蓋,這就變相的更新數(shù)據读处。
UPSERT INTO t_employee(id,salary) VALUES(1,10800.00);
刪除數(shù)據:
DELETE FROM t_employee WHERE name LIKE '張一%';
查詢數(shù)據:
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