HBase的RowKey設(shè)計(jì)技巧

HBase是三維有序存儲的荷荤,通過rowkey(行鍵)单山,column key(column family和qualifier)和TimeStamp(時間戳)這個三個維度可以對HBase中的數(shù)據(jù)進(jìn)行快速定位。

HBase中rowkey可以唯一標(biāo)識一行記錄黔牵,在HBase查詢的時候米者,有兩種方式:

  1. 通過get方式德召,指定rowkey獲取唯一一條記錄
  2. 通過scan方式辑舷,設(shè)置startRow和stopRow參數(shù)進(jìn)行范圍匹配
  3. 全表掃描喻犁,即直接掃描整張表中所有行記錄

rowkey長度原則

rowkey是一個二進(jìn)制碼流,可以是任意字符串何缓,最大長度64kb肢础,實(shí)際應(yīng)用中一般為10-100bytes,以byte[]形式保存碌廓,一般設(shè)計(jì)成定長传轰。
建議越短越好,不要超過16個字節(jié)谷婆,原因如下:

  1. 數(shù)據(jù)的持久化文件HFile中是按照KeyValue存儲的路召,如果rowkey過長,比如超過100字節(jié)波材,1000w行數(shù)據(jù),光rowkey就要占用100*1000w=10億個字節(jié)身隐,將近1G數(shù)據(jù)廷区,這樣會極大影響HFile的存儲效率;
  2. MemStore將緩存部分?jǐn)?shù)據(jù)到內(nèi)存贾铝,如果rowkey字段過長隙轻,內(nèi)存的有效利用率就會降低埠帕,系統(tǒng)不能緩存更多的數(shù)據(jù),這樣會降低檢索效率玖绿。
  3. 目前操作系統(tǒng)都是64位系統(tǒng)敛瓷,內(nèi)存8字節(jié)對齊,控制在16個字節(jié)斑匪,8字節(jié)的整數(shù)倍利用了操作系統(tǒng)的最佳特性呐籽。

rowkey散列原則

如果rowkey按照時間戳的方式遞增,不要將時間放在二進(jìn)制碼的前面蚀瘸,建議將rowkey的高位作為散列字段狡蝶,由程序隨機(jī)生成,低位放時間字段贮勃,這樣將提高數(shù)據(jù)均衡分布在每個RegionServer贪惹,以實(shí)現(xiàn)負(fù)載均衡的幾率。如果沒有散列字段寂嘉,首字段直接是時間信息奏瞬,所有的數(shù)據(jù)都會集中在一個RegionServer上,這樣在數(shù)據(jù)檢索的時候負(fù)載會集中在個別的RegionServer上泉孩,造成熱點(diǎn)問題硼端,會降低查詢效率。

rowkey唯一原則

必須在設(shè)計(jì)上保證其唯一性棵譬,rowkey是按照字典順序排序存儲的显蝌,因此,設(shè)計(jì)rowkey的時候订咸,要充分利用這個排序的特點(diǎn)曼尊,將經(jīng)常讀取的數(shù)據(jù)存儲到一塊,將最近可能會被訪問的數(shù)據(jù)放到一塊脏嚷。

什么是熱點(diǎn)

HBase中的行是按照rowkey的字典順序排序的骆撇,這種設(shè)計(jì)優(yōu)化了scan操作,可以將相關(guān)的行以及會被一起讀取的行存取在臨近位置父叙,便于scan神郊。然而糟糕的rowkey設(shè)計(jì)是熱點(diǎn)的源頭。熱點(diǎn)發(fā)生在大量的client直接訪問集群的一個或極少數(shù)個節(jié)點(diǎn)(訪問可能是讀趾唱,寫或者其他操作)涌乳。大量訪問會使熱點(diǎn)region所在的單個機(jī)器超出自身承受能力,引起性能下降甚至region不可用甜癞,這也會影響同一個RegionServer上的其他region夕晓,由于主機(jī)無法服務(wù)其他region的請求。設(shè)計(jì)良好的數(shù)據(jù)訪問模式以使集群被充分悠咱,均衡的利用蒸辆。

為了避免寫熱點(diǎn)征炼,設(shè)計(jì)rowkey使得不同行在同一個region,但是在更多數(shù)據(jù)情況下躬贡,數(shù)據(jù)應(yīng)該被寫入集群的多個region谆奥,而不是一個。

下面是一些常見的避免熱點(diǎn)的方法以及它們的優(yōu)缺點(diǎn):

加鹽

這里所說的加鹽不是密碼學(xué)中的加鹽拂玻,而是在rowkey的前面增加隨機(jī)數(shù)酸些,具體就是給rowkey分配一個隨機(jī)前綴以使得它和之前的rowkey的開頭不同。分配的前綴種類數(shù)量應(yīng)該和你想使用數(shù)據(jù)分散到不同的region的數(shù)量一致纺讲。加鹽之后的rowkey就會根據(jù)隨機(jī)生成的前綴分散到各個region上擂仍,以避免熱點(diǎn)。

哈希

哈希會使同一行永遠(yuǎn)用一個前綴加鹽熬甚。哈希也可以使負(fù)載分散到整個集群逢渔,但是讀卻是可以預(yù)測的。使用確定的哈舷缋ǎ可以讓客戶端重構(gòu)完整的rowkey肃廓,可以使用get操作準(zhǔn)確獲取某一個行數(shù)據(jù)

反轉(zhuǎn)

第三種防止熱點(diǎn)的方法時反轉(zhuǎn)固定長度或者數(shù)字格式的rowkey。這樣可以使得rowkey中經(jīng)常改變的部分(最沒有意義的部分)放在前面诲泌。這樣可以有效的隨機(jī)rowkey盲赊,但是犧牲了rowkey的有序性。

反轉(zhuǎn)rowkey的例子
以手機(jī)號為rowkey敷扫,可以將手機(jī)號反轉(zhuǎn)后的字符串作為rowkey哀蘑,這樣的就避免了以手機(jī)號那樣比較固定開頭導(dǎo)致熱點(diǎn)問題

時間戳反轉(zhuǎn)

一個常見的數(shù)據(jù)處理問題是快速獲取數(shù)據(jù)的最近版本,使用反轉(zhuǎn)的時間戳作為rowkey的一部分對這個問題十分有用,可以用Long.Max_Value - timestamp追加到key的末尾,例如[key][reverse_timestamp],[key]的最新值可以通過scan [key]獲得[key]的第一條記錄伺帘,因?yàn)镠Base中rowkey是有序的,第一條記錄是最后錄入的數(shù)據(jù)缀台。

比如需要保存一個用戶的操作記錄,按照操作時間倒序排序哮奇,在設(shè)計(jì)rowkey的時候膛腐,可以這樣設(shè)計(jì)
[userId反轉(zhuǎn)][Long.Max_Value - timestamp],在查詢用戶的所有操作記錄數(shù)據(jù)的時候鼎俘,直接指定反轉(zhuǎn)后的userId哲身,startRow是[userId反轉(zhuǎn)][000000000000],stopRow是[userId反轉(zhuǎn)][Long.Max_Value - timestamp]
如果需要查詢某段時間的操作記錄,startRow是[user反轉(zhuǎn)][Long.Max_Value - 起始時間]贸伐,stopRow是[userId反轉(zhuǎn)][Long.Max_Value - 結(jié)束時間]

其他一些建議

  • 盡量減少行和列的大小
    在HBase中律罢,value永遠(yuǎn)和它的key一起傳輸?shù)摹.?dāng)具體的值在系統(tǒng)間傳輸時,它的rowkey误辑,列名,時間戳也會一起傳輸歌逢。如果你的rowkey和列名很大巾钉,甚至可以和具體的值相比較,那么你將會遇到一些有趣的問題秘案。HBase storefiles中的索引(有助于隨機(jī)訪問)最終占據(jù)了HBase分配的大量內(nèi)存砰苍,因?yàn)榫唧w的值和它的key很大≮甯撸可以增加block大小使得storefiles索引再更大的時間間隔增加赚导,或者修改表的模式以減小rowkey和列名的大小。壓縮也有助于更大的索引赤惊。

  • 列族盡可能越短越好吼旧,最好是一個字符

  • 冗長的屬性名雖然可讀性好,但是更短的屬性名存儲在HBase中會更好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末未舟,一起剝皮案震驚了整個濱河市圈暗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裕膀,老刑警劉巖员串,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異昼扛,居然都是意外死亡寸齐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門抄谐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渺鹦,“玉大人,你說我怎么就攤上這事斯稳『C” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵挣惰,是天一觀的道長卧斟。 經(jīng)常有香客問我,道長憎茂,這世上最難降的妖魔是什么珍语? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮竖幔,結(jié)果婚禮上板乙,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好募逞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布蛋铆。 她就那樣靜靜地躺著,像睡著了一般放接。 火紅的嫁衣襯著肌膚如雪刺啦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天纠脾,我揣著相機(jī)與錄音玛瘸,去河邊找鬼。 笑死苟蹈,一個胖子當(dāng)著我的面吹牛糊渊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慧脱,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渺绒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了磷瘤?” 一聲冷哼從身側(cè)響起芒篷,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎采缚,沒想到半個月后针炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扳抽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年篡帕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贸呢。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡镰烧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楞陷,到底是詐尸還是另有隱情怔鳖,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布固蛾,位于F島的核電站结执,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艾凯。R本人自食惡果不足惜献幔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趾诗。 院中可真熱鬧蜡感,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至情连,卻和暖如春闪水,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒙具。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朽肥,地道東北人禁筏。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像衡招,于是被迫代替她去往敵國和親篱昔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容