Hbase面試題(持續更新)

聽海的石頭發表於2020-11-28

1、每天百億資料存入HBase,如何保證資料的儲存正確和在規定的時間裡全部錄入完畢,不殘留資料

1)百億資料:證明資料量非常大
2)存入HBase:證明是跟HBase的寫入資料有關
3)保證資料的正確:要設計正確的資料結構保證正確性
4)在規定時間內完成:對存入速度是有要求的

那麼針對以上的四個問題我們來一一分析
1)資料量百億條,什麼概念呢?假設一整天60x60x24 = 86400秒都在寫入資料,那麼每秒的寫入條數高達100萬條,HBase當然是支援不了每秒百萬條資料的,所以這百億條資料可能不是通過實時地寫入,而是批量地匯入。批量匯入推薦使用BulkLoad方式(
2)存入HBase:普通寫入是用JavaAPI put來實現,批量匯入推薦使用BulkLoad
3)保證資料的正確:這裡需要考慮RowKey的設計、預建分割槽和列族設計等問題
4)在規定時間內完成也就是存入速度不能過慢,並且當然是越快越好,使用BulkLoad

2、Hbase的六大特點

(1)表大:一個表可以有數億行,上百萬列。
(2)無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態增加,同一個表中的不同行的可以有截然不同的列。
(3)面向列:HBase是面向列的的儲存和許可權控制,列族獨立索引。
(4)稀疏:空(null)列並不佔用空間,表可以設計的非常稀疏。
(5)資料型別單一:HBase中的資料都是字串,沒有型別。
(6)資料多版本:每個單元中的資料可以有多個版本,預設情況下版本號自動分配,是單元格插入時的時間戳。

3、Hbase的rowkey設計原則:

(1)rowkey長度原則:rowkey是一個二進位制流,長度開發者建議是10-100位元組,不過建議越短越好,最好不超過16位元組。原因是:資料持久化檔案HFile中是按照按照key/value儲存的,如果rowkey太長的話就會影響HFile的儲存效率。Memstore將快取資料到記憶體,如果rowkey欄位過長記憶體的有效利用會降低,系統將會無法快取更多的資料,降低檢索的效率。
(2)rowkey雜湊原則:如果rowkey是按照時間戳方式遞增的話,不要將時間放在二進位制碼的前面,建議將rowkey的高位作為雜湊欄位,如果沒有雜湊欄位就會出現一個regionServer上堆積的熱點現象。
(3)rowkey的唯一原則:rowkey不能為空且唯一。

4、Hbase的查詢方式

1、全表查詢:scan tableName
2、基於rowkey的單行查詢:get tableName,‘1’
3、基於rowkey的範圍掃描:scan tableName, {STARTROW=>‘1’,STOPROW=>‘2’}
4、get和scan方法:
(1)、按指定的rowkey獲取唯一一條資料,get方法:分為兩種,分別是設定了closestRowBefore和沒有設定的rowlock,只要保證行的事務性,即每一個get是以一個row來標記的,一個row中可以有多個family和column。
(2)、按指定的條件獲取一批記錄,條件查詢。1、scan可以通過setCaching和setBatch方法來提高速度;2、scan也可以通過setStartRow和setEndRow來限定範圍(左閉右開),3、scan還可以通過setFileter方法來新增過濾器。
ps:setCache和setBatch方法:
setCache方法:這個方法設定即一次RPC請求放回的行數,對於快取操作來說,如果返回行數太多了,就可能記憶體溢位,那麼這個時候就需要setBatch方法,。
setBatch:設定這個之後客戶端可以選擇取回的列數,如果一行包括的列數超過了設定的值,那麼就可以將這個列分片。例如:如果一行17列,如果batch設定為5的話,就會返回四組,分別是5,5,5,2。、
※:Cache設定了伺服器一次返回的行數,而Batch設定了伺服器一次返回的列數。
ps:Batch引數決定了一行資料分為幾個result,它只針對一行資料,Cache決定了一次RPC返回的result個數。
RPC請求次數 = (行數 * 每行列數) / Min(每行的列數,批量大小) / 掃描器快取

5、Hbase的讀寫流程:

1、HBase的讀流程:
(1)、HRegisonServer儲存著.meta.表及資料表,首先client先訪問zk,訪問-ROOT-表,然後在zk上面獲取.meta.表所在的位置資訊,找到這個meta表在哪個HRegionServer上面儲存著。
(2)、接著client訪問HRegionServer表從而讀取.meta.進而獲取.meta.表中存放的後設資料。
(3)、client通過.meta.中的後設資料資訊,訪問對應的HRegionServer,然後掃描HRegionServer的Memstore和StoreFile來查詢資料。
(4)、最後把HRegionServer把資料反饋給client。
2、HBase的寫流程:
(1)client訪問zk中的-ROOT-表,然後後在訪問.meta.表,並獲取.meta.中的後設資料。
(2)確定當前要寫入的HRegion和HRegionServer。
(3)clinet向HRegionServer發出寫相應的請求,HRegionServer收到請求並響應。
(4)client先將資料寫入到HLog中,以防資料丟失。
(5)然後將資料寫入到MemStore中。
(6)如果HLog和MemStore都寫入成功了,那麼表示這個條資料寫入成功了。
(7)如果MemStore寫入的資料達到了閾值,那麼將會flush到StoreFile中。
(8)當StoreFile越來越多,會觸發Compact合併操作,將過多的StoteFile合併成一個大的StoreFile。
(9)當StoreFile越來越多時,Region也會越來越大,當達到閾值時,會觸發spilit操作,將這個Region一分為二。
ps:HBase中所有的更新和刪除操作都會在後續的compact中進行,使得使用者的寫操作只需要進入記憶體中就行了。實現了HBase的 I/O高效能。

相關文章