HBase學習筆記——高表與寬表的選擇
阿新 • • 發佈:2019-01-27
hbase中的寬表是指很多列較少行,即列多行少的表,一行中的資料量較大,行數少;高表是指很多行較少列,即行多列少,一行中的資料量較少,行數大。
hbase的row key是分散式的索引,也是分片的依據。
hbase的row key + column family + column qualifier + timestamp + value 是HFile中資料排列依據。HFile據此,對資料的索引到data block級別,而不是行級別。所以這種key是HFile內部的粗粒度(data block粒度)本地索引的主鍵。
據此,在HBase中使用寬表、高表的優劣總結如下:
- 查詢效能:高表更好,因為查詢條件都在row key中, 是全域性分散式索引的一部分。高表一行中的資料較少。所以查詢快取BlockCache能快取更多的行,以行數為單位的吞吐量會更高。
- 分片能力:高表分片粒度更細,各個分片的大小更均衡。因為高表一行的資料較少,寬表一行的資料較多。HBase按行來分片。
- 元資料開銷:高表元資料開銷更大。高錶行多,row key多,可能造成region數量也多,- root -、 .meta表資料量更大。過大的元資料開銷,可能引起HBase叢集的不穩定、master更大的負擔(這方面後續再好好總結)。
- 事務能力:寬表事務性更好。HBase對一行的寫入(Put)是有事務原子性的,一行的所有列要麼全部寫入成功,要麼全部沒有寫入。但是多行的更新之間沒有事務性保證。
- 資料壓縮比:如果我們對一行內的資料進行壓縮,寬表能獲得更高的壓縮比。因為寬表中,一行的資料量較大,往往存在更多相似的二進位制位元組,有利於提高壓縮比。通過壓縮,緩解了寬表一行資料量太大,並導致分片大小不均勻的問題。查詢時,我們根據row key找到壓縮後的資料,進行解壓縮。而且解壓縮可以通過協處理器(coproesssor)在HBase伺服器上做,而不是在業務應用的伺服器上做,以充分應用HBase叢集的CPU能力。
設計表時,可以不絕對追求高表、寬表,而是在兩者之間做好**平衡**。根據查詢模式,需要分散式索引、分片、**有很高選擇度**(即能據此查詢條件迅速鎖定很小範圍的一些行)的查詢用欄位,應該放入row key;能夠均勻地劃分資料位元組數的欄位,也應該放入row key,作為分片的依據。選擇度較低,並且不需要作為分片依據的查詢用欄位,放入column family和column qualifier,不放入row key。