經(jīng)典Hbase面試7題(附答案)

Hbase

  1. Hbase是怎么寫數(shù)據(jù)的?

  2. HDFS和HBase各自使用場(chǎng)景

  3. Hbase的存儲(chǔ)結(jié)構(gòu)

  4. 熱點(diǎn)現(xiàn)象(數(shù)據(jù)傾斜)怎么產(chǎn)生的新思,以及解決方法有哪些

  5. HBase的 rowkey 設(shè)計(jì)原則

  6. HBase的列簇設(shè)計(jì)

  7. HBase 中 compact 用途是什么主巍,什么時(shí)候觸發(fā)瓤帚,分為哪兩種蛇数,有什么區(qū)別

1. Hbase是怎么寫數(shù)據(jù)的?

Client寫入 -> 存入MemStore河质,一直到MemStore滿 -> Flush成一個(gè)StoreFile,直至增長(zhǎng)到一定閾值 -> 觸發(fā)Compact合并操作 -> 多個(gè)StoreFile合并成一個(gè)StoreFile震叙,同時(shí)進(jìn)行版本合并和數(shù)據(jù)刪除 -> 當(dāng)StoreFiles Compact后愤诱,逐步形成越來越大的StoreFile -> 單個(gè)StoreFile大小超過一定閾值后(默認(rèn)10G),觸發(fā)Split操作捐友,把當(dāng)前Region Split成2個(gè)Region淫半,Region會(huì)下線,新Split出的2個(gè)孩子Region會(huì)被HMaster分配到相應(yīng)的HRegionServer 上匣砖,使得原先1個(gè)Region的壓力得以分流到2個(gè)Region上

由此過程可知科吭,HBase只是增加數(shù)據(jù),沒有更新和刪除操作猴鲫,用戶的更新和刪除都是邏輯層面的对人,在物理層面,更新只是追加操作拂共,刪除只是標(biāo)記操作牺弄。

用戶寫操作只需要進(jìn)入到內(nèi)存即可立即返回,從而保證I/O高性能宜狐。

2. HDFS和HBase各自使用場(chǎng)景

首先一點(diǎn)需要明白:Hbase是基于HDFS來存儲(chǔ)的势告。

HDFS

  • 一次性寫入蛇捌,多次讀取。

  • 保證數(shù)據(jù)的一致性咱台。

  • 主要是可以部署在許多廉價(jià)機(jī)器中络拌,通過多副本提高可靠性,提供了容錯(cuò)和恢復(fù)機(jī)制回溺。

HBase

  • 瞬間寫入量很大春贸,數(shù)據(jù)庫不好支撐或需要很高成本支撐的場(chǎng)景。

  • 數(shù)據(jù)需要長(zhǎng)久保存遗遵,且量會(huì)持久增長(zhǎng)到比較大的場(chǎng)景萍恕。

  • HBase不適用與有 join,多級(jí)索引车要,表關(guān)系復(fù)雜的數(shù)據(jù)模型允粤。

  • 大數(shù)據(jù)量(100s TB級(jí)數(shù)據(jù))且有快速隨機(jī)訪問的需求。如:淘寶的交易歷史記錄屯蹦。數(shù)據(jù)量巨大無容置疑维哈,面向普通用戶的請(qǐng)求必然要即時(shí)響應(yīng)。

  • 業(yè)務(wù)場(chǎng)景簡(jiǎn)單登澜,不需要關(guān)系數(shù)據(jù)庫中很多特性(例如交叉列阔挠、交叉表,事務(wù)脑蠕,連接等等)购撼。

3. Hbase的存儲(chǔ)結(jié)構(gòu)

Hbase 中的每張表都通過行鍵(rowkey)按照一定的范圍被分割成多個(gè)子表(HRegion),默認(rèn)一個(gè)HRegion 超過256M 就要被分割成兩個(gè)谴仙,由HRegionServer管理迂求,管理哪些 HRegion 由 Hmaster 分配。HRegion 存取一個(gè)子表時(shí)晃跺,會(huì)創(chuàng)建一個(gè) HRegion 對(duì)象揩局,然后對(duì)表的每個(gè)列族(Column Family)創(chuàng)建一個(gè) store 實(shí)例, 每個(gè) store 都會(huì)有 0 個(gè)或多個(gè) StoreFile 與之對(duì)應(yīng)掀虎,每個(gè) StoreFile 都會(huì)對(duì)應(yīng)一個(gè)HFile凌盯,HFile 就是實(shí)際的存儲(chǔ)文件,一個(gè) HRegion 還擁有一個(gè) MemStore實(shí)例烹玉。

4. 熱點(diǎn)現(xiàn)象(數(shù)據(jù)傾斜)怎么產(chǎn)生的驰怎,以及解決方法有哪些

熱點(diǎn)現(xiàn)象

某個(gè)小的時(shí)段內(nèi),對(duì)HBase的讀寫請(qǐng)求集中到極少數(shù)的Region上二打,導(dǎo)致這些region所在的RegionServer處理請(qǐng)求量驟增县忌,負(fù)載量明顯偏大,而其他的RgionServer明顯空閑。

熱點(diǎn)現(xiàn)象出現(xiàn)的原因

HBase中的行是按照rowkey的字典順序排序的症杏,這種設(shè)計(jì)優(yōu)化了scan操作装获,可以將相關(guān)的行以及會(huì)被一起讀取的行存取在臨近位置,便于scan鸳慈。然而糟糕的rowkey設(shè)計(jì)是熱點(diǎn)的源頭饱溢。

熱點(diǎn)發(fā)生在大量的client直接訪問集群的一個(gè)或極少數(shù)個(gè)節(jié)點(diǎn)(訪問可能是讀喧伞,寫或者其他操作)走芋。大量訪問會(huì)使熱點(diǎn)region所在的單個(gè)機(jī)器超出自身承受能力,引起性能下降甚至region不可用潘鲫,這也會(huì)影響同一個(gè)RegionServer上的其他region翁逞,由于主機(jī)無法服務(wù)其他region的請(qǐng)求。

熱點(diǎn)現(xiàn)象解決辦法

為了避免寫熱點(diǎn)溉仑,設(shè)計(jì)rowkey使得不同行在同一個(gè)region挖函,但是在更多數(shù)據(jù)情況下,數(shù)據(jù)應(yīng)該被寫入集群的多個(gè)region浊竟,而不是一個(gè)怨喘。常見的方法有以下這些:

  • 加鹽:在rowkey的前面增加隨機(jī)數(shù),使得它和之前的rowkey的開頭不同振定。分配的前綴種類數(shù)量應(yīng)該和你想使用數(shù)據(jù)分散到不同的region的數(shù)量一致必怜。加鹽之后的rowkey就會(huì)根據(jù)隨機(jī)生成的前綴分散到各個(gè)region上,以避免熱點(diǎn)后频。

  • 哈希:哈鲜崆欤可以使負(fù)載分散到整個(gè)集群,但是讀卻是可以預(yù)測(cè)的卑惜。使用確定的哈细嘀矗可以讓客戶端重構(gòu)完整的rowkey,可以使用get操作準(zhǔn)確獲取某一個(gè)行數(shù)據(jù)

  • 反轉(zhuǎn):第三種防止熱點(diǎn)的方法時(shí)反轉(zhuǎn)固定長(zhǎng)度或者數(shù)字格式的rowkey露久。這樣可以使得rowkey中經(jīng)常改變的部分(最沒有意義的部分)放在前面更米。這樣可以有效的隨機(jī)rowkey,但是犧牲了rowkey的有序性毫痕。反轉(zhuǎn)rowkey的例子以手機(jī)號(hào)為rowkey征峦,可以將手機(jī)號(hào)反轉(zhuǎn)后的字符串作為rowkey,這樣的就避免了以手機(jī)號(hào)那樣比較固定開頭導(dǎo)致熱點(diǎn)問題

  • 時(shí)間戳反轉(zhuǎn):一個(gè)常見的數(shù)據(jù)處理問題是快速獲取數(shù)據(jù)的最近版本镇草,使用反轉(zhuǎn)的時(shí)間戳作為rowkey的一部分對(duì)這個(gè)問題十分有用眶痰,可以用 Long.Max_Value - timestamp 追加到key的末尾,例如[key][reverse_timestamp],[key]的最新值可以通過scan [key]獲得[key]的第一條記錄梯啤,因?yàn)镠Base中rowkey是有序的竖伯,第一條記錄是最后錄入的數(shù)據(jù)。
    比如需要保存一個(gè)用戶的操作記錄,按照操作時(shí)間倒序排序七婴,在設(shè)計(jì)rowkey的時(shí)候祟偷,可以這樣設(shè)計(jì)[userId反轉(zhuǎn)] [Long.Max_Value - timestamp],在查詢用戶的所有操作記錄數(shù)據(jù)的時(shí)候打厘,直接指定反轉(zhuǎn)后的userId修肠,startRow是[userId反轉(zhuǎn)][000000000000],stopRow是[userId反轉(zhuǎn)][Long.Max_Value - timestamp]
    如果需要查詢某段時(shí)間的操作記錄,startRow是[user反轉(zhuǎn)][Long.Max_Value - 起始時(shí)間]户盯,stopRow是[userId反轉(zhuǎn)][Long.Max_Value - 結(jié)束時(shí)間]

  • HBase建表預(yù)分區(qū):創(chuàng)建HBase表時(shí)嵌施,就預(yù)先根據(jù)可能的RowKey劃分出多個(gè)region而不是默認(rèn)的一個(gè),從而可以將后續(xù)的讀寫操作負(fù)載均衡到不同的region上莽鸭,避免熱點(diǎn)現(xiàn)象吗伤。

5. HBase的 rowkey 設(shè)計(jì)原則

  • 長(zhǎng)度原則:100字節(jié)以內(nèi),8的倍數(shù)最好硫眨,可能的情況下越短越好足淆。因?yàn)镠File是按照 keyvalue 存儲(chǔ)的,過長(zhǎng)的rowkey會(huì)影響存儲(chǔ)效率礁阁;其次巧号,過長(zhǎng)的rowkey在memstore中較大,影響緩沖效果姥闭,降低檢索效率丹鸿。最后,操作系統(tǒng)大多為64位泣栈,8的倍數(shù)卜高,充分利用操作系統(tǒng)的最佳性能。

  • 散列原則:高位散列南片,低位時(shí)間字段掺涛。避免熱點(diǎn)問題。

  • 唯一原則:分利用這個(gè)排序的特點(diǎn)疼进,將經(jīng)常讀取的數(shù)據(jù)存儲(chǔ)到一塊薪缆,將最近可能會(huì)被訪問 的數(shù)據(jù)放到一塊。

6. HBase的列簇設(shè)計(jì)

  • 原則:在合理范圍內(nèi)能盡量少的減少列簇就盡量減少列簇伞广,因?yàn)榱写厥枪蚕韗egion的拣帽,每個(gè)列簇?cái)?shù)據(jù)相差太大導(dǎo)致查詢效率低下。

  • 最優(yōu):將所有相關(guān)性很強(qiáng)的 key-value 都放在同一個(gè)列簇下嚼锄,這樣既能做到查詢效率最高减拭,也能保持盡可能少的訪問不同的磁盤文件。以用戶信息為例区丑,可以將必須的基本信息存放在一個(gè)列族拧粪,而一些附加的額外信息可以放在另一列族修陡。

7. HBase 中 compact 用途是什么,什么時(shí)候觸發(fā)可霎,分為哪兩種魄鸦,有什么區(qū)別

在 hbase 中每當(dāng)有 memstore 數(shù)據(jù) flush 到磁盤之后,就形成一個(gè) storefile癣朗,當(dāng) storeFile的數(shù)量達(dá)到一定程度后拾因,就需要將 storefile 文件來進(jìn)行 compaction 操作。

Compact 的作用:

  • 合并文件

  • 清除過期旷余,多余版本的數(shù)據(jù)

  • 提高讀寫數(shù)據(jù)的效率

HBase 中實(shí)現(xiàn)了兩種 compaction 的方式:minor and major. 這兩種 compaction 方式的區(qū)別是:

  • Minor 操作只用來做部分文件的合并操作以及包括 minVersion=0 并且設(shè)置 ttl 的過期版本清理绢记,不做任何刪除數(shù)據(jù)、多版本數(shù)據(jù)的清理工作荣暮。

  • Major 操作是對(duì) Region 下的 HStore 下的所有 StoreFile 執(zhí)行合并操作庭惜,最終的結(jié)果是整理合并出一個(gè)文件罩驻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末穗酥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惠遏,更是在濱河造成了極大的恐慌砾跃,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件节吮,死亡現(xiàn)場(chǎng)離奇詭異抽高,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)透绩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門翘骂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帚豪,你說我怎么就攤上這事碳竟。” “怎么了狸臣?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵莹桅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我烛亦,道長(zhǎng)诈泼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任煤禽,我火速辦了婚禮铐达,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檬果。我一直安慰自己瓮孙,他們只是感情好贾节,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衷畦,像睡著了一般栗涂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祈争,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天斤程,我揣著相機(jī)與錄音,去河邊找鬼菩混。 笑死忿墅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沮峡。 我是一名探鬼主播疚脐,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼邢疙!你這毒婦竟也來了棍弄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤疟游,失蹤者是張志新(化名)和其女友劉穎呼畸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颁虐,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛮原,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了另绩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儒陨。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖笋籽,靈堂內(nèi)的尸體忽然破棺而出蹦漠,到底是詐尸還是另有隱情,我是刑警寧澤干签,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布津辩,位于F島的核電站,受9級(jí)特大地震影響容劳,放射性物質(zhì)發(fā)生泄漏喘沿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一竭贩、第九天 我趴在偏房一處隱蔽的房頂上張望蚜印。 院中可真熱鬧,春花似錦留量、人聲如沸窄赋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忆绰。三九已至浩峡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間错敢,已是汗流浹背翰灾。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稚茅,地道東北人纸淮。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像亚享,于是被迫代替她去往敵國(guó)和親咽块。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • 30.ISR欺税、OSR侈沪、AR 是什么? ISR:In-Sync Replicas 副本同步隊(duì)列 OSR:Out-of...
    qydong閱讀 4,173評(píng)論 0 0
  • 11. mapreduce 的 shuffle 調(diào)優(yōu)參數(shù) 具體參考:MapReduce Shuffle性能調(diào)優(yōu) M...
    Java旅行者閱讀 1,185評(píng)論 0 2
  • 1,hbase讀流程 首先通過meta表找到要讀數(shù)據(jù)的region所在的RegionServer,然后去Block...
    寫scala的老劉閱讀 4,090評(píng)論 0 0
  • 1. hbase 的特點(diǎn)是什么魄衅? (1) Hbase一個(gè)分布式的基于列式存儲(chǔ)的數(shù)據(jù)庫,基于Hadoop的hdfs存...
    Tim在路上閱讀 627評(píng)論 0 9
  • hbase 的特點(diǎn)是什么 (1) Hbase一個(gè)分布式的基于列式存儲(chǔ)的數(shù)據(jù)庫,基于Hadoop的hdfs存儲(chǔ)峭竣,zo...
    Tim在路上閱讀 1,816評(píng)論 0 3