hbase的sql組件之phoenix和phoenix的二級索引的使用

hbase的sql組件之phoenix

hbase是一個列式nosql分佈式存儲引擎,在javaapi中對hbase的操作都是基於對象的形式,也可以寫mapreduce程序讀取hbase上的數據和把數據寫入數據,
phoenix組件給hbase添加了一個功能就是用sql來操作,這個組件可以在hbase上執行ddl和dml語句。
最重要的是支持二級索引,因爲在hbase中只支持rowkey索引不支持其他列的索引,我們可以把其他列的索引建立phoenix引擎上
我們可以用phoenix上訪問和創建結構化數據,在hbase上訪問和創建非結構化數據
所以當我們選擇了hbase,我們有個更多選擇和操作可以操作hbase,也可以操作phoenix,
可以操作非結構化數據,也可以操作非結構化數據

phoenix的安裝:
phoenix安裝特別簡單,只需在主節點上把它解壓,將phoenix的jar包拷貝到HBase的lib目錄,並啓動phoenix引擎就可以了
安裝步驟:
tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C ~/training/
將phoenix的jar包拷貝到HBase的lib目錄
cp *.jar ~/training/hbase-2.2.0/lib/
啓動phoenix:bin/sqlline.py bigdata111:2181
啓動的時候要指定連接hbase的zookeeper

有幾點需要大家注意

  1. 啓動後phoenix會自動在hbase上生成關於phoenix的系統表。
  2. phoenix上默認只能查看在phoenix上創建的表。
  3. 如果想讓phoenix訪問單獨在hbase上創建的數據需要讓這些數據在phoenix產生映射關係。
  4. 在phoenix上創建的表可以在hbase上查看

測試在hbase上提前創建好表,然後再建立映射讓phoenix訪問

  1. 首先我們在hbase上創建數據
			在HBase中
			create 'T3','INFO','GRADE'
			put 'T3','s001','INFO:NAME','Tom'
			put 'T3','s001','INFO:AGE','24'
			put 'T3','s001','GRADE:MATH','80'
			put 'T3','s002','INFO:NAME','Mary'

			在Phoniex中 創建視圖
			CREATE VIEW t3(pk VARCHAR PRIMARY KEY, 
			info.name VARCHAR,
			info.age VARCHAR,
			grade.math VARCHAR);
  1. 然後我們在hbase上查看一下是否已經創建好
    在這裏插入圖片描述
  2. 我們在未建立映射操作情況下去看一下phoenix上是否能夠查看到剛剛在hbase上創建的表
    在這裏插入圖片描述
    進入phoenix命令行模式
    執行查看所有表未發現T3表
  3. 在phoenix上建立關於T3的視圖
CREATE VIEW t3(pk VARCHAR PRIMARY KEY, 
			info.name VARCHAR,
			info.age VARCHAR,
			grade.math VARCHAR);

經過測試phoenix可以忽略大小寫的,所以這裏的t3就是我們在hbase上創建的T3表
在這裏插入圖片描述
在這裏插入圖片描述
phoenix二級索引
phoenix二級索引分爲全局索引、局部索引、覆蓋索引
全局索引就是在每個節點上創建索引,用於讀多寫少的情況
局部索引就是在個別節點上創建索引,用於讀少寫多的情況
覆蓋索引我感覺就像類搜索引起不但創建索引還創建索引的數據,一般索引是在索引表查這條數據的索引記錄在表在什麼位置,然後還需要去原來的表根據這條數據的位置再讀取這條數據,而覆蓋索引在讀取索引的時候如果這個索引同時是覆蓋索引那麼就只需讀取索引表就可以了不需要再讀取原來的表了
爲了方便測試我們提前往裏邊裝在一些數據:

create table emp 
(empno integer primary key,
ename varchar,
job varchar,
mgr integer,
hiredate varchar,
sal integer,
comm integer,
deptno integer);

create table dept
(deptno integer primary key,
dname varchar,
loc varchar
);

upsert into emp values(7369,'SMITH','CLERK',7902,'1980/12/17',800,0,20);
upsert into emp values(7499,'ALLEN','SALESMAN',7698,'1981/2/20',1600,300,30);
upsert into emp values(7521,'WARD','SALESMAN',7698,'1981/2/22',1250,500,30);
upsert into emp values(7566,'JONES','MANAGER',7839,'1981/4/2',2975,0,20);
upsert into emp values(7654,'MARTIN','SALESMAN',7698,'1981/9/28',1250,1400,30);
upsert into emp values(7698,'BLAKE','MANAGER',7839,'1981/5/1',2850,0,30);
upsert into emp values(7782,'CLARK','MANAGER',7839,'1981/6/9',2450,0,10);
upsert into emp values(7788,'SCOTT','ANALYST',7566,'1987/4/19',3000,0,20);
upsert into emp values(7839,'KING','PRESIDENT',-1,'1981/11/17',5000,0,10);
upsert into emp values(7844,'TURNER','SALESMAN',7698,'1981/9/8',1500,0,30);
upsert into emp values(7876,'ADAMS','CLERK',7788,'1987/5/23',1100,0,20);
upsert into emp values(7900,'JAMES','CLERK',7698,'1981/12/3',950,0,30);
upsert into emp values(7902,'FORD','ANALYST',7566,'1981/12/3',3000,0,20);
upsert into emp values(7934,'MILLER','CLERK',7782,'1982/1/23',1300,0,10);

upsert into dept values(10,'ACCOUNTING','NEW YORK');
upsert into dept values(20,'RESEARCH','DALLAS');
upsert into dept values(30,'SALES','CHICAGO');
upsert into dept values(40,'OPERATIONS','BOSTON');

我們也可以把上面的這些語句保存爲一個腳本,然後用phoenix的運行腳本的命令來運行這個腳本
查看phoenix所用的命令
在這裏插入圖片描述
使用run命令執行腳本
在這裏插入圖片描述
查看一下這個表是否創建成功
在這裏插入圖片描述
在這裏插入圖片描述
phoenix也支持執行計劃,我們使用執行計劃查看沒有創建二級索引的時候查詢過程
沒有創建索引的時候,倆張表都是全表掃描
在這裏插入圖片描述
創建一個索引
在這裏插入圖片描述
我們在創建二級索引的時候報一個錯:
Error: ERROR 1029 (42Y88): Mutable secondary indexes must have the hbase.regionserver.wal.codec property set to org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec in the hbase-sites.xml of every region server. tableName=INDEX001 (state=42Y88,code=1029)
它的意思是在創建二級索引的時候需要在hbase-site.xml中設置一個屬性hbase.regionserver.wal.codec的值爲org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec 。
然後我們退出phoenix和hbase,修改hbase-site.xml
在這裏插入圖片描述
然後再啓動phoenix命令行模式並創建剛纔那條創建索引的命令
在這裏插入圖片描述
在這裏插入圖片描述
我們創建了索引但是查看了執行計劃好像是沒有什麼變化,我們再看一下所以表中有沒有索引,

在這裏插入圖片描述
確實有但是沒有看到有關使用了索引的問題,這個問題待後續再查查是什麼引起的。
然後我們測試覆蓋索引

沒有創建索引之前:
在這裏插入圖片描述
然後我們在dept中建立一個覆蓋索引

create index index002 on dept(deptno) include(dname);

在這裏插入圖片描述
然後我們再測試一下
在這裏插入圖片描述
從查詢過程中感覺已經不再掃描全表只是掃描一下,但是時間上花也並不低,這個是由於另一個表太小表現不出什麼優勢,當表很大的時候就有優勢了!

注意一點:
我hbase用的是2.2的
phoenix用的是5.0-2.0的在創建索引後出現添加數據或刪除數據後報索引更新出錯問題,我安裝了幾次沒有把hbase2.0的安裝成功,總是啓動一會兒主節點就掛掉。完事我還要測試一下,再仔細安裝一次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章