hbase中的寬表是指很多列較少行,即列多行少的表小压,一行中的數(shù)據(jù)量較大线梗,行數(shù)少;高表是指很多行較少列怠益,即行多列少仪搔,一行中的數(shù)據(jù)量較少,行數(shù)大蜻牢。
hbase的row key是分布式的索引僻造,也是分片的依據(jù)憋他。
hbase的row key + column family + column qualifier + timestamp + value 是HFile中數(shù)據(jù)排列依據(jù)。HFile據(jù)此髓削,對(duì)數(shù)據(jù)的索引到data block級(jí)別竹挡,而不是行級(jí)別。所以這種key是HFile內(nèi)部的粗粒度(data block粒度)本地索引的主鍵立膛。
據(jù)此揪罕,在HBase中使用寬表、高表的優(yōu)劣總結(jié)如下:
查詢(xún)性能:高表更好宝泵,因?yàn)椴樵?xún)條件都在row key中, 是全局分布式索引的一部分好啰。高表一行中的數(shù)據(jù)較少。所以查詢(xún)緩存BlockCache能緩存更多的行儿奶,以行數(shù)為單位的吞吐量會(huì)更高框往。
分片能力:高表分片粒度更細(xì),各個(gè)分片的大小更均衡闯捎。因?yàn)楦弑硪恍械臄?shù)據(jù)較少椰弊,寬表一行的數(shù)據(jù)較多。HBase按行來(lái)分片瓤鼻。
元數(shù)據(jù)開(kāi)銷(xiāo):高表元數(shù)據(jù)開(kāi)銷(xiāo)更大秉版。高表行多,row key多茬祷,可能造成region數(shù)量也多清焕,- root -、 .meta表數(shù)據(jù)量更大祭犯。過(guò)大的元數(shù)據(jù)開(kāi)銷(xiāo)秸妥,可能引起HBase集群的不穩(wěn)定、master更大的負(fù)擔(dān)(這方面后續(xù)再好好總結(jié))沃粗。
事務(wù)能力:寬表事務(wù)性更好筛峭。HBase對(duì)一行的寫(xiě)入(Put)是有事務(wù)原子性的,一行的所有列要么全部寫(xiě)入成功陪每,要么全部沒(méi)有寫(xiě)入影晓。但是多行的更新之間沒(méi)有事務(wù)性保證。
數(shù)據(jù)壓縮比:如果我們對(duì)一行內(nèi)的數(shù)據(jù)進(jìn)行壓縮檩禾,寬表能獲得更高的壓縮比挂签。因?yàn)閷挶碇校恍械臄?shù)據(jù)量較大盼产,往往存在更多相似的二進(jìn)制字節(jié)饵婆,有利于提高壓縮比。通過(guò)壓縮戏售,緩解了寬表一行數(shù)據(jù)量太大侨核,并導(dǎo)致分片大小不均勻的問(wèn)題草穆。查詢(xún)時(shí),我們根據(jù)row key找到壓縮后的數(shù)據(jù)搓译,進(jìn)行解壓縮悲柱。而且解壓縮可以通過(guò)協(xié)處理器(coproesssor)在HBase服務(wù)器上做,而不是在業(yè)務(wù)應(yīng)用的服務(wù)器上做些己,以充分應(yīng)用HBase集群的CPU能力豌鸡。
設(shè)計(jì)表時(shí),可以不絕對(duì)追求高表段标、寬表涯冠,而是在兩者之間做好**平衡**。根據(jù)查詢(xún)模式逼庞,需要分布式索引蛇更、分片、**有很高選擇度**(即能據(jù)此查詢(xún)條件迅速鎖定很小范圍的一些行)的查詢(xún)用字段赛糟,應(yīng)該放入row key派任;能夠均勻地劃分?jǐn)?shù)據(jù)字節(jié)數(shù)的字段,也應(yīng)該放入row key虑灰,作為分片的依據(jù)吨瞎。選擇度較低痹兜,并且不需要作為分片依據(jù)的查詢(xún)用字段穆咐,放入column family和column qualifier,不放入row key字旭。