版本:
apache-phoenix-4.14.2-HBase-1.4-bin.tar.gz (選擇對應的hbase)
1.安裝phoenix
1).解壓犹赖,放到 /usr/local/phoenix
2).配置環(huán)境變量
sudo vim /etc/profile
export PHOENIX_HOME=/usr/local/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
source /etc/profile
3).將 Phoenix 目錄下的 phoenix-core-4.14.2-HBase-1.4.jar、phoenix-4.14.2-HBase-1.4-server.jar 拷貝到 hbase 集群各個節(jié)點 hbase 安裝目錄 lib 中(單機就是一個hbase了)审洞。
4).將 hbase 集群中的配置文件 hbase-site.xml 拷貝到 Phoenix 的 bin 目錄下雄卷,覆蓋原有的配置文件更鲁。
5).將 hdfs 集群中的配置文件 core-site.xml漫试、 hdfs-site.xml 拷貝到 Phoenix 的 bin 目錄下
2.啟動;
命令格式:./sqlline.sh <hbase.zookeeper.quorum>
我的ubuntu 的hostname是master
./sqlline.sh master
3.測試
在客戶端執(zhí)行 !tables 命令搁骑,羅列所有表到客戶端界面
!tables
4.phoenix圖形查詢工具squirrel
在windows電腦上下載squirrel,修改hosts文件
添加ubuntu 的ip以及名字
修改C:\Windows\System32\drivers\etc\hosts
如果hosts文件沒有權限先復制到桌面修改再粘貼覆蓋回去
增加行如下:
#phoenix主機的ip以及hostname
192.168.1.21 master
5.在 Spark 運行環(huán)境中添加 Phoenix 依賴
spark-env.sh 添加如下代碼:
添加 Phoenix 依賴
for file in $(find /opt/hbase-1.2.4/lib |grep phoenix)
do
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:$file"
done
export SPARK_DIST_CLASSPATH
這樣每次啟動 spark 任務都會將 phoenix 的 jar 包添加到 classpath 了
6.語法規(guī)則 ------------------------------
如果報錯記得在表名加雙引號
1). 插入數(shù)據(jù)
在 Phoenix 中是沒有 Insert 語句的屋讶,取而代之的是 Upsert 語句冰寻。Upsert 有兩種用法须教,
分別是:upsert into 和 upsert select
upsert into:
類似于 insert into 的語句皿渗,旨在單條插入外部數(shù)據(jù)
upsert into tb values('ak','hhh',222)
upsert into tb(stat,city,num) values('ak','hhh',222)
upsert select:
類似于 Hive 中的 insert select 語句,旨在批量插入其他表的數(shù)據(jù)轻腺。
upsert into tb1 (state,city,population) select state,city,population from tb2 where population < 40000;
upsert into tb1 select state,city,population from tb2 where population > 40000;
upsert into tb1 select * from tb2 where population > 40000;
注意:在 phoenix 中插入語句并不會像傳統(tǒng)數(shù)據(jù)庫一樣存在重復數(shù)據(jù)乐疆。
因為 Phoenix 是構建在 HBase 之上的,也就是必須存在一個主鍵贬养。
后面插入的會覆蓋前面的挤土,但是時間戳不一樣。
2). 刪除數(shù)據(jù)
delete from tb; 清空表中所有記錄误算,Phoenix 中不能使用 truncate table tb仰美;
delete from tb where city = 'kenai';
drop table tb; 刪除表
delete from system.catalog where table_name = 'int_s6a';
drop table if exists tb;
drop table my_schema.tb;
drop table my_schema.tb cascade; 用于刪除表的同時刪除基于該表的所有視圖迷殿。
3). 修改數(shù)據(jù)
由于 HBase 的主鍵設計,相同 rowkey 的內容可以直接覆蓋咖杂,這就變相的更新了數(shù)據(jù)庆寺。
所以 Phoenix 的更新操作仍舊是 upsert into 和 upsert select
upsert into us_population (state,city,population) values('ak','juneau',40711);
4). 查詢數(shù)據(jù)
union all, group by诉字, order by懦尝, limit 都支持
select * from test limit 1000;
select * from test limit 1000 offset 100;
select full_name from sales_person where ranking >= 5.0 union all select reviewer_name from customer_review where score >= 8.0
5). 在 Phoenix 中是沒有 Database 的概念的,所有的表都在同一個命名空間壤圃。但支持多個命名空間
設置為 true陵霉,創(chuàng)建的帶有 schema 的表將映射到一個 namespace
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
6). 創(chuàng)建表
A.SALT_BUCKETS (加鹽)
加鹽 Salting 能夠通過預分區(qū) (pre-splitting) 數(shù)據(jù)到多個 region 中來顯著提升讀寫性能。
本質是在 hbase 中伍绳,rowkey 的 byte 數(shù)組的第一個字節(jié)位置設定一個系統(tǒng)生成的 byte 值踊挠,
這個 byte 值是由主鍵生成 rowkey 的 byte 數(shù)組做一個哈希算法,計算得來的墨叛。
Salting 之后可以把數(shù)據(jù)分布到不同的 region 上止毕,這樣有利于 phoenix 并發(fā)的讀寫操作。
SALT_BUCKETS 的值范圍在(1 ~ 256):
create table test(host varchar not null primary key, description varchar)salt_buckets=16;
upsert into test (host,description) values ('192.168.0.1','s1');
upsert into test (host,description) values ('192.168.0.2','s2');
upsert into test (host,description) values ('192.168.0.3','s3');
salted table 可以自動在每一個 rowkey 前面加上一個字節(jié)漠趁,這樣對于一段連續(xù)的 rowkeys扁凛,它們在表中實際存儲時,就被自動地分布到不同的 region 中去了闯传。
當指定要讀寫該段區(qū)間內的數(shù)據(jù)時谨朝,也就避免了讀寫操作都集中在同一個 region 上。
簡而言之甥绿,如果我們用 Phoenix 創(chuàng)建了一個 saltedtable字币,那么向該表中寫入數(shù)據(jù)時,
原始的 rowkey 的前面會被自動地加上一個 byte(不同的 rowkey 會被分配不同的 byte)共缕,使得連續(xù)的 rowkeys 也能被均勻地分布到多個 regions洗出。
B.Pre-split(預分區(qū))
Salting 能夠自動的設置表預分區(qū),但是你得去控制表是如何分區(qū)的图谷,
所以在建 phoenix 表時翩活,可以精確的指定要根據(jù)什么值來做預分區(qū),比如:
create table test (host varchar not null primary key, description varchar) split on ('cs','eu','na');
C. 使用多列族
列族包含相關的數(shù)據(jù)都在獨立的文件中便贵,在 Phoenix 設置多個列族可以提高查詢性能菠镇。
創(chuàng)建兩個列族:
create table test (
mykey varchar not null primary key,
a.col1 varchar,
a.col2 varchar,
b.col3 varchar
);
upsert into test values ('key1','a1','b1','c1');
upsert into test values ('key2','a2','b2','c2');
D. 使用壓縮
create table test (host varchar not null primary key, description varchar) compression='snappy';
7). 創(chuàng)建視圖,刪除視圖
create view "my_hbase_table"( k varchar primary key, "v" unsigned_long) default_column_family='a';
create view my_view ( new_col smallint ) as select * from my_table where k = 100;
create view my_view_on_view as select * from my_view where new_col > 70
create view v1 as select * from test where description in ('s1','s2','s3')
drop view my_view
drop view if exists my_schema.my_view
drop view if exists my_schema.my_view cascade
8). 創(chuàng)建二級索引
支持可變數(shù)據(jù)和不可變數(shù)據(jù)(數(shù)據(jù)插入后不再更新)上建立二級索引
create index my_idx on sales.opportunity(last_updated_date desc)
create index my_idx on log.event(created_date desc) include (name, payload) salt_buckets=10
create index if not exists my_comp_idx on server_metrics ( gc_time desc, created_date desc )
data_block_encoding='none',versions=?,max_filesize=2000000 split on (?, ?, ?)
create index my_idx on sales.opportunity(upper(contact_name))
create index test_index on test (host) include (description);
刪除索引:
drop index my_idx on sales.opportunity
drop index if exists my_idx on server_metrics
drop index if exists xdgl_acct_fee_index on xdgl_acct_fee
默認是可變表承璃,手動創(chuàng)建不可變表
create table hao2 (k varchar primary key, v varchar) immutable_rows=true;
alter table HAO2 set IMMUTABLE_ROWS = false; 修改為可變
alter index index1 on tb rebuild; 索引重建是把索引表清空后重新裝配數(shù)據(jù)利耍。
Global Indexing 多讀少寫,適合條件較少
create index my_index on items(price);
調用方法:
- 強制索引
select /*+ index(items my_index) */ * from items where price=0.8824734;
drop index my_name on usertable;
- 覆蓋索引 Covered Indexes,需要 include 包含需要返回數(shù)據(jù)結果的列隘梨。
create index index1_c on hao1 (age) include (name); name 已經被緩存在這張索引表里了程癌。
對于 select name from hao1 where age=2,查詢效率和速度最快
select * from hao1 where age =2轴猎,其他列不在索引表內席楚,會全表掃描
Local Indexing 寫多讀少,不是索引字段索引表也會被使用税稼,索引數(shù)據(jù)和真實數(shù)據(jù)存儲在同一臺機器上(
create local index index3_l_name on hao1 (name);
異步創(chuàng)建索引烦秩,創(chuàng)建的索引表中不會有數(shù)據(jù),單獨使用命令行工具來執(zhí)行數(shù)據(jù)的創(chuàng)建
create index index1_c on hao1 (age) include(name) async;
hbase org.apache.phoenix.mapreduce.index.indextool
--schema my_schema --data-table my_table --index-table async_idx
--output-path async_idx_hfiles
9). 與現(xiàn)有的 HBase 表關聯(lián)
首先創(chuàng)建一張 HBase 表郎仆,再創(chuàng)建的 Phoenix 表只祠,表名必須和 HBase 表名一致即可。
create 'stu' ,'cf1','cf2'
put 'stu', 'key1','cf1:name','luozhao'
put 'stu', 'key1','cf1:sex','man'
put 'stu', 'key1','cf2:age','24'
put 'stu', 'key1','cf2:adress','cqupt'
create table "stu" (
id VARCHAR NOT NULL PRIMARY KEY ,
"cf1"."name" VARCHAR ,
"cf1"."sex" VARCHAR ,
"cf2"."age" VARCHAR ,
"cf2"."adress" VARCHAR );
upsert into "stu"(id,"cf1"."name","cf1"."sex","cf2"."age","cf2"."adress") values('key6','zkk','man','111','Beijing');
select * from "stu"; 會發(fā)現(xiàn)兩張表是數(shù)據(jù)同步的扰肌。
這里查詢表名需要用雙引號括起來抛寝,強制不轉換為大寫。
這里一定要注意的是表名和列族以及列名需要用雙引號括起來曙旭,因為 HBase 是區(qū)分大小寫的盗舰,
如果不用雙引號括起來的話 Phoenix 在創(chuàng)建表的時候會自動將小寫轉換為大寫字母