數倉數開面試題真題總結(五)

五。Hbase

1。Hbase調優

高可用

在HBase中Hmaster負責監控RegionServer的生命週期,均衡RegionServer的負載,如果Hmaster掛掉了,那麼整個HBase叢集將陷入不健康的狀態,並且此時的工作狀態並不會維持太久。所以HBase支援對Hmaster的高可用配置。

預分割槽

每一個region維護著startRow與endRowKey,如果加入的資料符合某個region維護的rowKey範圍,則該資料交給這個region 維護。那麼依照這個原則,我們可以將資料所要投放的分割槽提前大致的規劃好,以提高HBase效能。

最佳化RowKey設計

一條資料的唯一標識就是rowkey,那麼這條資料儲存於哪個分割槽,取決於rowkey處於哪個一個預分割槽的區間內,設計rowkey 的主要目的 ,就是讓資料均勻的分佈於所有的region中,在一定程度上防止資料傾斜

記憶體最佳化

HBase操作過程中需要大量的記憶體開銷,畢竟Table是可以快取在記憶體中的,一般會分配整個可用記憶體的70%給HBase的Java堆。但是不建議分配非常大的堆記憶體,因為GC過程持續太久會導致RegionServer處於長期不可用狀態,一般16~48G記憶體就可以了,如果因為框架佔用記憶體過高導致系統記憶體不足,框架一樣會被系統服務拖死。

2。hbase的rowkey怎麼建立好?列族怎麼建立比較好?

hbase儲存時,資料按照Row key的字典序(byte order)排序儲存。設計key時,要充分排序儲存這個特性,將經常一起讀取的行儲存放到一起。(位置相關性)

一個列族在資料底層是一個檔案,所以將經常一起查詢的列放到一個列族中,列族儘量少,減少檔案的定址時間。

設計原則

1)rowkey 長度原則

2)rowkey 雜湊原則

3)rowkey 唯一原則

如何設計

1)生成隨機數、hash、雜湊值

2)字串反轉

3) 字串拼接

3。hbase過濾器實現用途

增強hbase查詢資料的功能

減少服務端返回給客戶端的資料量

4。HBase宕機如何處理

答:宕機分為HMaster宕機和HRegisoner宕機,如果是HRegisoner宕機,HMaster會將其所管理的region重新分佈到其他活動的RegionServer上,由於資料和日誌都持久在HDFS中,該操作不會導致資料丟失。所以資料的一致性和安全性是有保障的。

如果是HMaster宕機,HMaster沒有單點問題,HBase中可以啟動多個HMaster,透過Zookeeper的Master Election機制保證總有一個Master執行。即ZooKeeper會保證總會有一個HMaster在對外提供服務。

5。hive跟hbase的區別是?

共同點:

1。hbase與hive都是架構在hadoop之上的。都是用hadoop作為底層儲存

區別:

2。Hive是建立在Hadoop之上為了減少MapReduce jobs編寫工作的批處理系統,HBase是為了支援彌補Hadoop對實時操作的缺陷的專案 。

3。想象你在操作RMDB資料庫,如果是全表掃描,就用Hive+Hadoop,如果是索引訪問,就用HBase+Hadoop 。

4。Hive query就是MapReduce jobs可以從5分鐘到數小時不止,HBase是非常高效的,肯定比Hive高效的多。

5。Hive本身不儲存和計算資料,它完全依賴於HDFS和MapReduce,Hive中的表純邏輯。

6。hive借用hadoop的MapReduce來完成一些hive中的命令的執行

7。hbase是物理表,不是邏輯表,提供一個超大的記憶體hash表,搜尋引擎透過它來儲存索引,方便查詢操作。

8。hbase是列儲存。

9。hdfs作為底層儲存,hdfs是存放檔案的系統,而Hbase負責組織檔案。

10。hive需要用到hdfs儲存檔案,需要用到MapReduce計算框架。

6。hbase寫流程

數倉/數開面試題真題總結(五)

1/ 客戶端要連線zookeeper, 從zk的/hbase節點找到hbase:meta表所在的regionserver(host:port);

2/ regionserver掃描hbase:meta中的每個region的起始行健,對比r000001這條資料在那個region的範圍內;

3/ 從對應的 info:server key中儲存了region是有哪個regionserver(host:port)在負責的;

4/ 客戶端直接請求對應的regionserver;

5/ regionserver接收到客戶端發來的請求之後,就會將資料寫入到region中

7。hbase讀流程

數倉/數開面試題真題總結(五)

1/ 首先Client連線zookeeper, 找到hbase:meta表所在的regionserver;

2/ 請求對應的regionserver,掃描hbase:meta表,根據namespace、表名和rowkey在meta表中找到r00001所在的region是由那個regionserver負責的;

3/找到這個region對應的regionserver

4/ regionserver收到了請求之後,掃描對應的region返回資料到Client

(先從MemStore找資料,如果沒有,再到BlockCache裡面讀;BlockCache還沒有,再到StoreFile上讀(為了讀取的效率);

如果是從StoreFile裡面讀取的資料,不是直接返回給客戶端,而是先寫入BlockCache,再返回給客戶端。)

8。hbase資料flush過程

1)當MemStore資料達到閾值(預設是128M,老版本是64M),將資料刷到硬碟,將記憶體中的資料刪除,同時刪除HLog中的歷史資料;

2)並將資料儲存到HDFS中;

3)在HLog中做標記點。

9。資料合併過程

當資料塊達到4塊,hmaster將資料塊載入到本地,進行合併

當合並的資料超過256M,進行拆分,將拆分後的region分配給不同的hregionserver管理

當hregionser宕機後,將hregionserver上的hlog拆分,然後分配給不同的hregionserver載入,修改。META。

注意:hlog會同步到hdfs

10。Hmaster和Hgionserver職責

Hmaster

1、管理使用者對Table的增、刪、改、查操作;

2、記錄region在哪臺Hregion server上

3、在Region Split後,負責新Region的分配;

4、新機器加入時,管理HRegion Server的負載均衡,調整Region分佈

5、在HRegion Server宕機後,負責失效HRegion Server 上的Regions遷移。

Hgionserver

HRegion Server主要負責響應使用者I/O請求,向HDFS檔案系統中讀寫資料,是HBASE中最核心的模組。

HRegion Server管理了很多table的分割槽,也就是region。

11。HBase列族和region的關係?

HBase有多個RegionServer,每個RegionServer裡有多個Region,一個Region中存放著若干行的行鍵以及所對應的資料,一個列族是一個資料夾,如果經常要搜尋整個一條資料,列族越少越好,如果只有一部分的資料需要經常被搜尋,那麼將經常搜尋的建立一個列族,其他不常搜尋的建立列族檢索較快。

12。請簡述Hbase的物理模型是什麼

13。請問如果使用Hbase做即席查詢,如何設計二級索引

14。如何避免讀、寫HBaes時訪問熱點問題?

(1)加鹽

這裡所說的加鹽不是密碼學中的加鹽,而是在rowkey的前面增加隨機數,具體就是給rowkey分配一個隨機字首以使得它和之前的rowkey的開頭不同。給多少個字首?這個數量應該和我們想要分散資料到不同的region的數量一致(類似hive裡面的分桶)。

( 自己理解:即region數量是一個範圍,我們給rowkey分配一個隨機數,字首(隨機數)的範圍是region的數量)

加鹽之後的rowkey就會根據隨機生成的字首分散到各個region上,以避免熱點。

(2)雜湊

雜湊會使同一行永遠用一個字首加鹽。雜湊也可以使負載分散到整個叢集,但是讀卻是可以預測的。使用確定的雜湊可以讓客戶端重構完整的rowkey,可以使用get操作準確獲取某一個行資料。

(3)反轉

第三種防止熱點的方法是反轉固定長度或者數字格式的rowkey。這樣可以使得rowkey中經常改變的部分(最沒有意義的部分)放在前面。這樣可以有效的隨機rowkey,但是犧牲了rowkey的有序性。反轉rowkey的例子:以手機號為rowkey,可以將手機號反轉後的字串作為rowkey,從而避免諸如139、158之類的固定號碼開頭導 致的熱點問題。

(4)時間戳反轉

一個常見的資料處理問題是快速獲取資料的最近版本,使用反轉的時間戳作為rowkey的一部分對這個問題十分有用,可以用Long。Max_Value – timestamp追加到key的末尾,例如[key][reverse_timestamp] ,[key] 的最新值可以透過scan [key]獲得[key]的第一條記錄,因為HBase中rowkey是有序的,第一條記錄是最後錄入的資料。

(5)儘量減少行和列的大小

在HBase中,value永遠和它的key一起傳輸的。當具體的值在系統間傳輸時,它的rowkey,列名,時間戳也會一起傳輸。如果你的rowkey和列名很大,HBase storefiles中的索引(有助於隨機訪問)會佔據HBase分配的大量記憶體,因為具體的值和它的key很大。可以增加block大小使得storefiles索引再更大的時間間隔增加,或者修改表的模式以減小rowkey和列名的大小。壓縮也有助於更大的索引。

(6)其他辦法

列族名的長度儘可能小,最好是隻有一個字元。冗長的屬性名雖然可讀性好,但是更短的屬性名儲存在HBase中會更好。也可以在建表時預估資料規模,預留region數量,例如create ‘myspace:mytable’, SPLITS => [01,02,03,,…99]

15。布隆過濾器在HBASE中的應用

主要提高隨機讀的效能

16。Hbase是用來幹嘛的?什麼樣的資料會放到hbase

17。Hbase和Hive的區別與適用場景

18。Hbase在建表時的設計原則(注意事項)

1、預分割槽

Hbase預設建表時有一個 region,這個 region的 rowkey是沒有邊界的,即沒有 startkey和 endkey在資料寫入時,所有資料都會寫入這個預設的 region,隨著資料量的不斷增加,會進行 split,分成2個 region在此過程中,會產生兩個問題:

1。資料往一個 region寫,會有寫熱點問題。2。 region split會消耗寶貴的叢集I/0資源。我們可以控制在建表的時候,建立多個空 region,並確定每個 region的 startkey和 endkey,這樣只要我們的 rowkey設計能均勻的命中各個 region,就不會存在寫熱點問題。自然 split的機率也會大大降低。

2、 rowkey設計原則

(1) rowkey長度越短越好。資料的持久化檔案 Hfile中是按照 Keyvalue儲存的,如果 rowkey過長會極大影響File的儲存效率; Memstore將快取部分資料到記憶體,如果 rowk-ey欄位過長,記憶體的有效利用率就會降低,系統不能快取更多的資料,這樣會降低檢索效率。

2) rowkey儘量雜湊。建議將 rowkey的高位作為雜湊欄位,將提高資料均衡分佈在每個 Regionserver以實現負載均衡的機率。(雜湊、反轉等也可以避免熱點問題

(3) rowkey保證唯一性。

3、列族設計原則

(1)建表至少指定一個列族,但一般不超過三個,一般一個,因為 flush和 compact是以 region為單位,所以,某個 column family在 flush的時候,它鄰近的 column family也會因關聯效應被觸發f1ush,最終導致系統產生更多的1/0

2)列族名字不宜過長,會冗餘儲存。

3)不同列族的記錄的數量級不易相差太大,比如A,B兩個列族,A為100萬條,B為100億條,則A會被分散到多個 region(可能會跨 reglon server),導致對A的掃描效率低下

19。hbase最佳化方法

1、減少調整

(1)減少 region分裂

根據你的 Rowkey設計來進行預建分割槽,減少 region的動態分裂。

2)給HFi1設定合適大小

Hfile是資料底層儲存檔案,在每個 memstore進行重新整理時會生成一 Hfile,當 Hfile增加到一定程度時,會將屬於一個 region的HFi1e進行合併,這個步驟會帶來開銷但不可避免,但是合併後 reglon大小如果大於設定的值,那麼 region會進行分裂。為了減少這樣的無謂的1/0開銷,建議估計專案資料量大小,給 Hfile設定一個合適的值

2、減少啟停

Hbase中也存在頻繁開啟關閉帯來的問題。

(1)關閉 Compaction,在閒時進行手動 Compact ion0因為 Hbase中存在 Minor Compaction和

Ma jor Compaction,合併就是1/0讀寫,大量的 Hfile進行肯定會帶來I/0開銷,甚至是1/0風暴所以為了避免這種不受控制的意外發生,建議關閉自動 Compact ion,在閒時進行 compaction o2)當需要寫入大量離線資料時建議使用 Bul kloado

3、減少資料量

(1)開啟過濾,提高查詢速度,可以減少網路102)使用壓縮:一般推薦使用 Snappy和LZ0壓縮。

4、合理設計(建表注意事項)

分割槽、 Rowkey設計、列族的設計

20。Hbase中的region server發生故障後的處理方法(zk——>WAL)

Hbase檢測宕機是透過 Zookeeper實現的,正常情況下 Regionserver會週期性向 Zookeeper傳送心跳,一旦發生宕機,心跳就會停止,超過一定時間( Sessi ontimeout) Zookeeper就會認為 Regionserver宕機離線,並將該訊息通知給 Master0一臺 Regionserver只有一個Hog檔案,然後,將og按照

Region進行分組,切分到每個 regionserver中,因此在回放之前首先需要將og按照 Region進行分組,每個 Region的日誌資料放在一起,方便後面按照 Region進行回放。這個分組的過程就稱為HLog切分。然後再對 region重新分配,並對其中的Hog進行回放將資料寫入 memstore刷寫到磁碟,完成最終資料恢復。