目錄:
1、建表優化
2、二級索引
3、並行處理
1.建表優化
- Salting 翻譯成中文是加鹽的意思,本質是在hbase的rowkey的byte數組的第一個字節位置設定一個系統生成的byte值, 這個byte值是由主鍵生成rowkey的byte數組做一個哈希算法,計算得來的。Salting之后可以把數據分布到不同的region上,這樣有利於phoenix並發的讀寫操作。 示例:CREATE TABLE TEST (HOST VARCHAR NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR) SALT_BUCKETS=16
- Pre-split 這個就是HBase的預分區了,在建phoenix表時,可以精確的指定要根據什么值來做預分區 示例: CREATE TABLE TEST (HOST VARCHAR NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR) SPLIT ON ('CS','EU','NA')
- 使用多個列族,在創建phoenix表是可以指定列所在的列族 示例: CREATE TABLE TEST (MYKEY VARCHAR NOT NULL PRIMARY KEY, A.COL1 VARCHAR, A.COL2 VARCHAR, B.COL3 VARCHAR)
- 在數據量大的表上使用壓縮算法來提高性能 GZ,lzo等 示例: CREATE TABLE TEST (HOST VARCHAR NOT NULL PRIMARY KEY, DESCRIPTION VARCHAR) COMPRESSION='GZ'
2.二級索引
Phoenix的二級索引從2.1版本開始支持可變和不可變(數據插入之后不可更新)數據了,之前的版本只支持不可變的數據,我們現在使用的版本是2.2.2是支持二級索引的,我們可以做一些嘗試。
可以通過explain select … 來看phoniex在執行sql時是否用上了二級索引。
3.並行
Phoenix會將一個聚合查詢分成多個Scan,然后將這些Scan分配給phoenix自定義的hbase協處理器,這些協處理器可以在服務器端並行執行來提高查詢性能。平衡的拆分表是Phoenix獲得高效查詢的最重要因素之一,這包括將相等大小的分區平均分配到不同的region server上。這個工具http://www.sentric.ch/blog/hbase-split-visualisation-introducing-hannibal 可以幫助我們監控hbase表分區的情況。表中的數據在各個region sever上均勻分布可以保證每一個phoenix線程處理的數據量相當,這樣就可以減少查詢的等待時間。
在客戶端可以通過phoenix.query.targetConcurrency 和 phoenix.query.maxConcurrency 來控制查詢如何來拆分掃描。並行查詢最好可以將查詢scan的切分和表數據的region切分對齊。如果掃描很不均勻,就需要用多個線程來處理數據量較大的分區掃描。
並行執行掃描時的切分點定義如下,我們假設:
t 是目標的並發數
m 是最大的並發數
r 是我們要掃描的分區數
if r >= t 使用表的region邊界 Else if r/2 > t 將每個region都拆分成s份,s滿足公式: s = max(x) x滿足 s * x < m Else 將每個region拆分成s份,s滿足公式:s = max(x) x滿足 s * x < t |
可以根據客戶端機器的內核數和集群的大小,來調大phoenix.query.threadPoolSize, phoenix.query.queueSize, phoenix.query.maxConcurrency, 和 phoenix.query.targetConcurrency的值,允許更多的線程做並行的查詢,來降低延遲。
但是這個方法也並非沒有限制,最大的問題是phoenix沒有足夠的信息來拆分region。 如果查詢結果跨越很多region,這沒有問題,因為region中總會有一些大小相差不多的region,然而如果查詢僅僅涉及到少數幾個region,可能就會有問題