面試題百日百刷-描述HBase的rowKey的設(shè)計(jì)原則?
鎖屏面試題百日百刷,每個(gè)工作日堅(jiān)持更新面試題。鎖屏面試題app、小程序現(xiàn)已上線,官網(wǎng)地址:https://www.demosoftware.cn。已收錄了每日更新的面試題的所有內(nèi)容,還包含特色的解鎖屏幕復(fù)習(xí)面試題、每日編程題目郵件推送等功能。讓你在面試中先人一步!接下來的是今日的面試題:
1.描述HBase的rowKey的設(shè)計(jì)原則?
①?Rowkey長度原則
Rowkey?是一個(gè)二進(jìn)制碼流,Rowkey?的長度被很多開發(fā)者建議說設(shè)計(jì)在10~100?個(gè)字節(jié),不過建議是越短越好,不要超過16?個(gè)字節(jié)。
原因如下:
(1)數(shù)據(jù)的持久化文件HFile?中是按照KeyValue?存儲的,如果Rowkey?過長比如100?個(gè)字節(jié),1000?萬列數(shù)據(jù)光Rowkey?就要占用100*1000?萬=10?億個(gè)字節(jié),將近1G?數(shù)據(jù),這會極大影響HFile?的存儲效率;
(2)MemStore?將緩存部分?jǐn)?shù)據(jù)到內(nèi)存,如果Rowkey?字段過長內(nèi)存的有效利用率會降低,系統(tǒng)將無法緩存更多的數(shù)據(jù),這會降低檢索效率。因此Rowkey?的字節(jié)長度越短越好。
(3)目前操作系統(tǒng)是都是64?位系統(tǒng),內(nèi)存8?字節(jié)對齊??刂圃?6?個(gè)字節(jié),8?字節(jié)的整數(shù)倍利用操作系統(tǒng)的最佳特性。
②?Rowkey散列原則
如果Rowkey?是按時(shí)間戳的方式遞增,不要將時(shí)間放在二進(jìn)制碼的前面,建議將Rowkey的高位作為散列字段,由程序循環(huán)生成,低位放時(shí)間字段,這樣將提高數(shù)據(jù)均衡分布在每個(gè)Regionserver?實(shí)現(xiàn)負(fù)載均衡的幾率。如果沒有散列字段,首字段直接是時(shí)間信息將產(chǎn)生所有新數(shù)據(jù)都在一個(gè)?RegionServer?上堆積的熱點(diǎn)現(xiàn)象,這樣在做數(shù)據(jù)檢索的時(shí)候負(fù)載將會集中在個(gè)別RegionServer,降低查詢效率。
③?Rowkey唯一原則
必須在設(shè)計(jì)上保證其唯一性。
2.描述HBase中scan和get的功能以及實(shí)現(xiàn)的異同?
HBase的查詢實(shí)現(xiàn)只提供兩種方式:
1)按指定RowKey?獲取唯一一條記錄,get方法(org.apache.hadoop.hbase.client.Get)
Get?的方法處理分兩種?:?設(shè)置了ClosestRowBefore?和沒有設(shè)置ClosestRowBefore的rowlock。主要是用來保證行的事務(wù)性,即每個(gè)get?是以一個(gè)row?來標(biāo)記的。一個(gè)row中可以有很多family?和column。
2)按指定的條件獲取一批記錄,scan方法(org.apache.Hadoop.hbase.client.Scan)實(shí)現(xiàn)條件查詢功能使用的就是scan?方式。
(1)scan?可以通過setCaching?與setBatch?方法提高速度(以空間換時(shí)間);
(2)scan?可以通過setStartRow?與setEndRow?來限定范圍([start,end)start?是閉區(qū)間,end?是開區(qū)間)。范圍越小,性能越高。
(3)scan?可以通過setFilter?方法添加過濾器,這也是分頁、多條件查詢的基礎(chǔ)。
3.請描述HBase中scan對象的setCache和setBatch方法的使用?
setCache用于設(shè)置緩存,即設(shè)置一次RPC請求可以獲取多行數(shù)據(jù)。對于緩存操作,如果行的數(shù)據(jù)量非常大,多行數(shù)據(jù)有可能超過客戶端進(jìn)程的內(nèi)存容量,由此引入批量處理這一解決方案。
setBatch?用于設(shè)置批量處理,批量可以讓用戶選擇每一次ResultScanner實(shí)例的next操作要取回多少列,例如,在掃描中設(shè)置setBatch(5),則一次next()返回的Result實(shí)例會包括5列。如果一行包括的列數(shù)超過了批量中設(shè)置的值,則可以將這一行分片,每次next操作返回一片,當(dāng)一行的列數(shù)不能被批量中設(shè)置的值整除時(shí),最后一次返回的Result實(shí)例會包含比較少的列,如,一行17列,batch設(shè)置為5,則一共返回4個(gè)Result實(shí)例,這4個(gè)實(shí)例中包括的列數(shù)分別為5、5、5、2。
組合使用掃描器緩存和批量大小,可以讓用戶方便地控制掃描一個(gè)范圍內(nèi)的行鍵所需要的RPC調(diào)用次數(shù)。
Cache設(shè)置了服務(wù)器一次返回的行數(shù),而Batch設(shè)置了服務(wù)器一次返回的列數(shù)。
假如我們建立了一張有兩個(gè)列族的表,添加了10行數(shù)據(jù),每個(gè)行的每個(gè)列族下有10列,這意味著整個(gè)表一共有200列(或單元格,因?yàn)槊總€(gè)列只有一個(gè)版本),其中每行有20列。

① Batch參數(shù)決定了一行數(shù)據(jù)分為幾個(gè)Result,它只針對一行數(shù)據(jù),Batch再大,也只能將一行的數(shù)據(jù)放入一個(gè)Result中。所以當(dāng)一行數(shù)據(jù)有10列,而Batch為100時(shí),也只能將一行的所有列都放入一個(gè)Result,不會混合其他行;
②?緩存值決定一次RPC返回幾個(gè)Result,根據(jù)Batch劃分的Result個(gè)數(shù)除以緩存?zhèn)€數(shù)可以得到RPC消息個(gè)數(shù)(之前定義緩存值決定一次返回的行數(shù),這是不準(zhǔn)確的,準(zhǔn)確來說是決定一次RPC返回的Result個(gè)數(shù),由于在引入Batch之前,一行封裝為一個(gè)Result,因此定義緩存值決定一次返回的行數(shù),但引入Batch后,更準(zhǔn)確的說法是緩存值決定了一次RPC返回的Result個(gè)數(shù));