Phoenix入門(上)

本文作者:林偉兵纲辽,叩丁狼高級講師。原創(chuàng)文章令宿,轉載請注明出處楣号。

1.Phoenix概述

Phoenix是一個開源的HBASE SQL層API最易。Phoeinx可以用標準的JDBC API替代HBASE client API來創(chuàng)建表,插入和查詢查詢HBASE中的數(shù)據炫狱。Phoenix作為應用層和HBASE之間的中間件,以下特性使它在大數(shù)據量的簡單查詢場景有著獨有的優(yōu)勢:

  1. 支持二級索引.
  2. 編譯SQL成為原生HBase的可并行執(zhí)行的查詢藻懒,并下推where過濾條件到server端的scan filter上
  3. 在數(shù)據層完成計算,server端的coprocessor執(zhí)行聚合
  4. 利用統(tǒng)計信息優(yōu)化视译、選擇查詢計劃
  5. skip scan功能提高掃描速度

2.Phoenix&DBeaver安裝

安裝步驟如下:

  1. 不同版本的Phoenix對應不同的HBase版本嬉荆,找到對應的版本下載并解壓。下載地址如下:http://phoenix.apache.org/download.html
  2. 將 phoenix-[version]-server.jar 添加到HBase的各個節(jié)點的lib文件夾下酷含。
  3. 重啟 HBase.
  4. 配置Phoenix環(huán)境變量鄙早。
## 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主要是用來實現(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)異常布讹。如下介紹如何刪除表:

  1. 創(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

  1. 創(chuàng)建建表文件 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. 查詢表數(shù)據文件 score_querries.sql
SELECT student,scores[1] as "math" FROM t_score;
  1. 執(zhí)行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. 數(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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市罚舱,隨后出現(xiàn)的幾起案子井辜,更是在濱河造成了極大的恐慌,老刑警劉巖管闷,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粥脚,死亡現(xiàn)場離奇詭異,居然都是意外死亡渐北,警方通過查閱死者的電腦和手機阿逃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赃蛛,“玉大人恃锉,你說我怎么就攤上這事∨槐郏” “怎么了破托?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歧蒋。 經常有香客問我土砂,道長州既,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任萝映,我火速辦了婚禮吴叶,結果婚禮上,老公的妹妹穿的比我還像新娘序臂。我一直安慰自己蚌卤,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布奥秆。 她就那樣靜靜地躺著逊彭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪构订。 梳的紋絲不亂的頭發(fā)上侮叮,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音悼瘾,去河邊找鬼囊榜。 笑死,一個胖子當著我的面吹牛分尸,可吹牛的內容都是我干的锦聊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼箩绍,長吁一口氣:“原來是場噩夢啊……” “哼孔庭!你這毒婦竟也來了?” 一聲冷哼從身側響起材蛛,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤圆到,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卑吭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芽淡,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年豆赏,在試婚紗的時候發(fā)現(xiàn)自己被綠了挣菲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掷邦,死狀恐怖白胀,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情抚岗,我是刑警寧澤或杠,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站宣蔚,受9級特大地震影響向抢,放射性物質發(fā)生泄漏认境。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一挟鸠、第九天 我趴在偏房一處隱蔽的房頂上張望叉信。 院中可真熱鬧,春花似錦兄猩、人聲如沸茉盏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铜秆,卻和暖如春淹真,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背连茧。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工核蘸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啸驯。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓客扎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親罚斗。 傳聞我的和親對象是個殘疾皇子徙鱼,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 1 使用概述 2 環(huán)境配置 3 SQL特性詳解 1)create:可以創(chuàng)建一張表或視圖。表名如果沒有用雙引號括起來...
    4ea0af17fd67閱讀 12,442評論 0 10
  • 轉自 沈釗偉 HBase 在大數(shù)據生態(tài)圈中的位置 提到大數(shù)據的存儲针姿,大多數(shù)人首先聯(lián)想到的是 Hadoop 和 Ha...
    wangxiaoda閱讀 1,244評論 0 19
  • 你是否已經沖入了大數(shù)據的浩瀚海洋袱吆,然后在里面跌宕起伏,遇坑無數(shù)距淫?你是否被一堆API,接口,命令孔轴,文檔而折磨杀糯?初入大...
    叁金閱讀 543評論 1 3
  • 重陽那天狰晚,我?guī)е患依闲∪ヒ粋€蠻高檔的水療會所。里邊有個兒童樂園堂污,有個5歲左右的小男孩表現(xiàn)地特別“野蠻”家肯,在樂園里...
    舒女王Suven閱讀 341評論 0 2
  • (一) 蒼山掩落日, 寒水映暮天盟猖。 遙看南嶺上讨衣, ...
    臨朐老戰(zhàn)閱讀 271評論 0 0