轉自:https://yq.aliyun.com/articles/213705?utm_content=m_31236緩存
hbase中的寬表是指不少列較少行,即列多行少的表,一行中的數據量較大,行數少;高表是指不少行較少列,即行多列少,一行中的數據量較少,行數大。服務器
hbase的row key是分佈式的索引,也是分片的依據。
hbase的row key + column family + column qualifier + timestamp + value 是HFile中數據排列依據。HFile據此,對數據的索引到data block級別,而不是行級別。因此這種key是HFile內部的粗粒度(data block粒度)本地索引的主鍵。分佈式
據此,在HBase中使用寬表、高表的優劣總結以下:ide
查詢性能:高表更好,由於查詢條件都在row key中, 是全局分佈式索引的一部分。高表一行中的數據較少。因此查詢緩存BlockCache能緩存更多的行,以行數爲單位的吞吐量會更高。性能
分片能力:高表分片粒度更細,各個分片的大小更均衡。由於高表一行的數據較少,寬表一行的數據較多。HBase按行來分片。設計
元數據開銷:高表元數據開銷更大。高錶行多,row key多,可能形成region數量也多,- root -、 .meta表數據量更大。過大的元數據開銷,可能引發HBase集羣的不穩定、master更大的負擔(這方面後續再好好總結)。索引
事務能力:寬表事務性更好。HBase對一行的寫入(Put)是有事務原子性的,一行的全部列要麼所有寫入成功,要麼所有沒有寫入。可是多行的更新之間沒有事務性保證。事務
數據壓縮比:若是咱們對一行內的數據進行壓縮,寬表能得到更高的壓縮比。由於寬表中,一行的數據量較大,每每存在更多類似的二進制字節,有利於提升壓縮比。經過壓縮,緩解了寬表一行數據量太大,並致使分片大小不均勻的問題。查詢時,咱們根據row key找到壓縮後的數據,進行解壓縮。並且解壓縮能夠經過協處理器(coproesssor)在HBase服務器上作,而不是在業務應用的服務器上作,以充分應用HBase集羣的CPU能力。get
設計表時,能夠不絕對追求高表、寬表,而是在二者之間作好平衡。根據查詢模式,須要分佈式索引、分片、有很高選擇度(即能據此查詢條件迅速鎖定很小範圍的一些行)的查詢用字段,應該放入row key;可以均勻地劃分數據字節數的字段,也應該放入row key,做爲分片的依據。選擇度較低,而且不須要做爲分片依據的查詢用字段,放入column family和column qualifier,不放入row key。it