簡單的HBase Client端實現
來源:程序員人生 發布時間:2015-01-08 14:01:45 閱讀次數:2581次
前言
newbie剛接觸HBase,遇到幾個初學者常見的關于HBase問題,這里就問題就不多做介紹,主要還是編碼優化問題,下面專門介紹以下幾點,希望對初學者有所幫助。
基于HBase-0.94.x 版本
Tips
RowKey的設計
HBase的不管甚么操作都是對rowkey進行掃描操作的,rowkey的排序是依照字典序來排的。
IO斟酌
為讀優化
設計行健時,盡可能把行健依照序號緊挨1起,減少掃描。
為寫優化
主要是斟酌所有的rowkey不要寫到同1個region上,這樣會致使其他機器很空閑,只有這個region的吞吐量就是你利用的吞吐量
例如時間戳做行健就會出現這個問題。
解決方法主要是兩個:
- 散列,建表時分表,然后寫入時使用散列函數,將行健打散散布,這樣做只是為了寫操作多的優化,對讀來講,多是災害(全表掃描)
- salting,使用隨機值做前綴,解決散列全表掃描的問題
Merge相同的rowKey
由于HBase對每個命令(put,delete,get,increment)都是起1個線程來做的,每一個命令基本都有
addFamily(), addCloumns()方法可使用
這里漏掉1點是為何要merge:由于HBase對每個命令都是起1個thread來履行(0.94),所以為了減少thread的創建,所以盡可能merge
這里有人會問,merge以后的履行性能和merge之前的性能如何,會快還是慢??其實性能相差無幾,具體可以去淘寶量子恒道blog(貌似打不開)上去看看測試結果
是不是需要自己做HTable Connection緩存管理
這1點是不需要的,HBase本身有Cache機制的,主要在HConnectionManager里面做管理,它會做緩存。每次close時也會檢查該cacheINstance是不是還有reference,如果有就暫時不close,沒有就close,reference⑴。詳細請看HConnectionManager源碼;
public static HConnection getConnection(final Configuration conf)
throws IOException {
HConnectionKey connectionKey = new HConnectionKey(conf);
synchronized (CONNECTION_INSTANCES) {
HConnectionImplementation connection = CONNECTION_INSTANCES.get(connectionKey);
if (connection == null) {
connection = (HConnectionImplementation)createConnection(conf, true);
CONNECTION_INSTANCES.put(connectionKey, connection);
} else if (connection.isClosed()) {
HConnectionManager.deleteConnection(connectionKey, true);
connection = (HConnectionImplementation)createConnection(conf, true);
CONNECTION_INSTANCES.put(connectionKey, connection);
}
connection.incCount();
return connection;
}
}
Code
我自己實現了1個簡單的Hbase Client,不是線程安全,在github上,可以clone下參考,僅供參考(為經測試,可能存在毛?。?/div>
simple-hbase-client: git clone https://github.com/zhgwen/simple-hbase-client.git
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
------分隔線----------------------------
------分隔線----------------------------