1-預(yù)分區(qū)
- 默認(rèn)情況下,在創(chuàng)建HBase表的時候會自動創(chuàng)建一個region分區(qū),當(dāng)導(dǎo)入數(shù)據(jù)的時候,所有的HBase客戶端都向這一個region寫數(shù)據(jù),直到這個region足夠大了才進(jìn)行切分。一種可以加快批量寫入速度的方法是通過預(yù)先創(chuàng)建一些空的regions,這樣當(dāng)數(shù)據(jù)寫入HBase時,會按照region分區(qū)情況,在集群內(nèi)做數(shù)據(jù)的負(fù)載均衡。
- 具體方法Hbase--基礎(chǔ)知識點總結(jié)(掃盲篇)中預(yù)分區(qū)操作
2-RowKey設(shè)計
3-列族數(shù)
- 不要在一張表里定義太多的 column family。目前Hbase并不能很好的處理超過2~3個column family的表。因為某個column family在flush的時候,它鄰近的column family也會因關(guān)聯(lián)效應(yīng)被觸發(fā)flush,最終導(dǎo)致系統(tǒng)產(chǎn)生更多的I/O。
- 具體參考連接 Hbase--為什么不建議在Hbase中使用過多列族
4-In Memory
- 創(chuàng)建表的時候,可以通過HColumnDescriptor.setInMemory(true)將表放到RegionServer的緩存中,保證在讀取表的時候被cache命中;
5-Max Version
- 創(chuàng)建表的時候,可以通過HColumnDesriptor.setMaxVersions(int maxVersions)設(shè)置表中數(shù)據(jù)的最大版本數(shù),如果只需要保存最新版本的數(shù)據(jù),那么可以設(shè)置setMaxVersions(1);
6-Time To Live
- 創(chuàng)建表的時候,可以通過HColumnDescriptor.setTimeToLive(int timeToLive)設(shè)置表中的數(shù)據(jù)的存儲生命期,過期的數(shù)據(jù)自動被刪除,例如如果只需要存儲最近兩天的數(shù)據(jù),那么可以設(shè)置setTimeToLive(22460*60);
7-Compact & Split
- 在HBase中,數(shù)據(jù)在更新時首先寫入WAL 日志(HLog)和內(nèi)存(MemStore)中,MemStore中的數(shù)據(jù)是排序的,當(dāng)MemStore累計到一定閾值時,就會創(chuàng)建一個新的MemStore,并且將老的MemStore添加到flush隊列,由單獨的線程flush到磁盤上,成為一個StoreFile。于此同時, 系統(tǒng)會在zookeeper中記錄一個redo point,表示這個時刻之前的變更已經(jīng)持久化了(minor compact)。
- StoreFile是只讀的,一旦創(chuàng)建后就不可以再修改。因此Hbase的更新其實是不斷追加的操作。當(dāng)一個Store中的StoreFile達(dá)到一定的閾值后,就會進(jìn)行一次合并(major compact),將對同一個key的修改合并到一起,形成一個大的StoreFile,當(dāng)StoreFile的大小達(dá)到一定閾值后,又會對 StoreFile進(jìn)行分割(split),等分為兩個StoreFile。
- 由于對表的更新是不斷追加的,處理讀請求時,需要訪問Store中全部的StoreFile和MemStore,將它們按照row key進(jìn)行合并,由于StoreFile和MemStore都是經(jīng)過排序的,并且StoreFile帶有內(nèi)存中索引,通常合并過程還是比較快的。
- 實際應(yīng)用中,可以考慮必要時手動進(jìn)行major compact,將同一個row key的修改進(jìn)行合并形成一個大的StoreFile。同時,可以將StoreFile設(shè)置大些,減少split的發(fā)生。
參考鏈接:https://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section1.html