Hbase 解答題(理論知識面試必問)

1.Hbase 的基本介紹

  1. HBase 時建立在hdfs之上的數據庫
  2. 不支持join等SQL事務等繁雜的操作
  3. 支持的數類型:byte[]
  4. 依靠橫向擴展,一個表可以有上十億行,上百萬列
  5. 面向列族存儲和權限控制
  6. 對於空(null)的列,並不佔用存儲空間,是一個稀疏表

 2.HBASE的使用場景 (12個字)

  1. 海量數據
  2. 精確查詢
  3. 快速返回

3.Hbase 和hadoop之間的關係

    HDFS:

  1. 海量數據儲存,適合一次掃描大量數據
  2. 適合一次寫入,多出讀取
  3. 不適合頻繁修改數據

    Hbase

  1.  適合一詞掃描少量數據
  2. 合適多次寫入多次讀取
  3. 支持數據更新
  4. 支持刪除數據

4.Hbase 與Rdbms 的關係

    RDBMS:

  1. 支持SQL查詢
  2. 支持事務
  3. 支持join

    hbase:

  1. 不支持SQL查詢
  2. 不支持事務
  3. 不支持join

 5.HBase 詳細架構 

      Client

       訪問數據的入口,包含訪問hbase的API接口,維護着一些cache來加快對hbase的訪問

      Zookeeper

       1.zookeeper的選舉機制保證任何時候,集羣中只有一個master

       2.實時監控Region Server的狀態,將Region server的上線和下線信息實時通知給Master

       3.存儲Hbase的schema

      4.存貯所有Region的尋址入口

      Master

     1.爲Region server分配region

     2.負責region server的負載均衡

     3.發現失效的region server並重新分配其上的region

     4.處理schema(元數據)更新請求

     說明:Hmaster短時間下線,hbase集羣依然可用,長時間不行。

      Region server

      1.Region server維護Master分配給它的region,處理對這些region的IO請求

     2.Region server負責切分在運行過程中變得過大的region

6. Row Key

最大長度是 64KB,完全可以自行設計。Hbase會對錶中的數據按照rowkey排序(字典序)

7.列族Column Family

列族是表的schema的一部分,而列不是。(schema包含表名和列族)

每個列都所屬於某一個列族。一個列族可以包含多個列。一個列族與列的關係是一對多。

8.時間戳

標記一個數據的不同版本,時間戳可以由hbase(在數據寫入時自動 )賦值,hbase支持工程師自己定義時間戳。每個 cell中,不同版本的數據按照時間倒序排序

9.hbase本身提供數據回收機制

1.保存數據的最後n個版本

2.保存最近一段時間內的版本

10. Cell

存儲數據的最小單位,由{row key, column( = + ), version} 唯一確定的單元確定一個精確的數據

11.VersionNum

數據的版本號,默認值爲系統時間戳。

12. hbase物理存儲

1.一個regionserver內部可以有多個region,這多個region可能來自多個表或一個表。一個region只能屬於一個 regionserver.

2.一個regionserver只有一個HLog

3.一個region裏面可以有多個store

4.一個store裏面只有一個memstore

13.rtegion的切分

region按大小分割的(默認10G)。每個表一開始只有一個region,隨着數據的增加,一個region逐漸變大,達到 10G,進行分裂,等分成兩個region.

14. Memstore與storefile

一個region由多個store組成,每個store包含一個列族的所有數據 Store包括位於內存的memstore和位於硬盤的 storefile

客戶端檢索數據時,先在memstore找,找不到再找storefile

15.HLog(WAL log)

每個Region Server維護一個Hlog,而不是每個Region一個.

Hlog的切分機制

1.當數據寫入hlog以後,hbase發生異常。關閉當前的hlog文件

2.當日志的大小達到HDFS數據塊的0.95倍的時候,關閉當前日誌,生成新的日誌

3.每隔一小時生成一個新的日誌文件

16.讀請求過程

meta是hbase系統自帶的一個表。裏面存儲了hbase用戶表的元信息。

元信息爲meta表內記錄一行數據是用戶表一個region的start key 到endkey的範圍。

meta表存儲在regionserver裏。 具體存儲在哪個regionserver裏?zookeeper知道。

過程:

1.客戶端到zookeeper詢問meta表在哪

2.客戶端到meta所在的節點(regionserver)讀取meta表的數據

3.客戶端找到region 獲取region和regionserver的對應關係,直接到regionserver讀取region數據

17.HBase的特徵

1.海量存儲:Hbase適合存儲PB級別的海量數據,在幾十到百毫秒內返回數據。

2.列式存儲:這裏的列式存儲其實說的是列族存儲列族理論上可以很多,但實際上建議不要超過6

3.極易擴展:處理能力(RegionServer)的擴展,是基於存儲的擴展(HDFS

4.高併發:這裏說的高併發,主要是在併發的情況下,Hbase的單個IO延遲下降並不多

5.稀疏:在列數據爲空的情況下,是不會佔用存儲空間的。

18. 寫請求過程

1.Client先訪問zookeeper,找到Meta表,並獲取Meta表元數據。確定當前將要寫入的數據所對應的HRegion和 HRegionServer服務器。

2.Client向該HRegionServer服務器發起寫入數據請求。

3.Client先把數據寫入到HLog,以防止數據丟失,然後將數據寫入到Memstore。  

4.Memstore達到閾值,會把Memstore中的數據flush到Storefile中

5.當Storefile越來越多,達到一定數量時,會觸發Compact合併操作,將多個小文件合併成一個大文件。

6.Storefile越來越大,Region也會越來越大,達到閾值後,會觸發Split操作,變成兩個文件。

說明:hbasez 支持數據修改(僞修改),實際上是相同rowkey數據的添加。hbase只顯示最後一次的添加

19. region的分配過程

前提:一個region只能分配給一個region server

1.master記錄了當前有哪些可用的region server。以及當前哪些region分配給了哪些region server,哪些region還沒有分配。

2.當需要分配的新的region,並且有一個region server上有可用空間時,master就給這個region server發送一個裝載請求,把region分配給這個region server。

3.region server得到請求後,就開始對此region提供服務。

20. region server上線

前提:master使用zookeeper來跟蹤region server狀態。

1.當某個region server啓動時,首先在zookeeper上的/hbase/rs目錄下建立代表自己的znode。

2.master訂閱了/hbase/rs目錄上的變更消息,當/hbase/rs目錄下的文件出現新增或刪除操作時,master可以得到來自zookeeper的實時通知。因此一旦region server上線,master能馬上得到消息

21.region server下線

前提:master使用zookeeper來跟蹤region server狀態。

1.當region server下線時,它和zookeeper的會話斷開。

2.zookeeper而自動釋放代表這臺server的文件上的獨佔鎖(znode)

3.zookeeper將變化發送給master

4.master 將掛掉的region server的region分配給其它還活着的regionserver

22.Hmaster的上線

前提:hbase集羣中可以設置多個Hmaster,真正對外提供服務的只有一個

1.從zookeeper上獲取唯一 一個代表active master的鎖,用來阻止其它master成爲真正的master。

2.掃描zookeeper上的/hbase/rs節點,獲得當前可用的region server列表。

3.master和每個region server通信,獲得當前已分配的region和region server的對應關係。 4.master掃描.META.表,計算得到當前還未分配的region,將他們放入待分配region列表。

23.Hmaster下線後的影響

master只維護表和region的元數據,不參與表數據IO的過程,所以master下線短時間內對整個hbase集羣沒有影響。表的數據讀寫還可以正常進行。

無法創建刪除表,無法修改表的schema,無法進行region的負載均衡,無法處理region 上下線,無法進行region的 合併(region的split可以正常進行) 當hmaster下線後,啓動Zookeeper的選舉機制,選出新的Hmaster,新的Hmaster上線,執行上線流程。

24.flush機制

全局的memstore的flush機制默認爲堆總大小(多個memstore 多個region)的40%,超過該大小會觸發flush到磁盤的操作,會阻塞客戶端讀寫,flush將所有的memstore全部flush.

單個的memstore默認爲數據達到128M或1h或者數據爲堆大小 0.95倍將會flush. memstore默認將會先提前flush 5M.(先flush一小部分,等後面數據達到閾值在flush後 面的數據) 這樣會比一次flush效率高

hbase不建議配置過多列族:過多的列族會消耗大量的內存,同時數據在flush時消耗磁盤IO. 一個regionserver續寫操作可用堆內存的80%,讀取佔用40% ,寫入佔用40%。這兩個參數直接影響hbase讀寫性能。

25.compact機制

默認3個小的storeFile文件達到三個,合併成大的Storefile文件。

 

26.split機制

默認一個HFile達到10Gb的時候就會進行切分

27.hbase預分區的優點

1.增加數據讀寫效率:數據分佈在多臺regionserver節點

2.負載均衡,防止數據傾斜:當數據時離散的發送時,預分區可以解決數據傾斜

3.方便集羣調度region: 分佈在多個節點便於調度

4.優化Map數量

28.rowKey的獲取方式

1.通過rowkey直接查找

2.通過startkey endkey 範圍查找

3.全表掃描

29.rowkey散列原則

建議將rowkey的高位(左邊)作爲散列字段, 低位(右邊)放時間字段,這樣將提高數據均衡分佈在每個 RegionServer,以實現負載均衡的機率。

若不按照此原則:

讓時間戳作爲高位,數據將按照時間的順序進行存儲會引發熱點問題

30.rowkey散列原則

建議將rowkey的高位(左邊)作爲散列字段, 低位(右邊)放時間字段,這樣將提高數據均衡分佈在每個 RegionServer,以實現負載均衡的機率。

若不按照此原則:

讓時間戳作爲高位,數據將按照時間的順序進行存儲會引發熱點問題

31.什麼是熱點問題

當有一點時間業務數據爆炸增長時,這個階段的數據將存儲在少數的節點上。

32.如何解決熱點問題

原則:將分散的數據,放在rowkey的高位

1.哈希(隨機數):將哈希值放在高位

2.反轉:反轉固定長度或者數字格式的數據(時間戳反轉、手機號反轉,訂單號反轉)

3.加鹽:本質時是加隨機數,並且放在高位。

 

 

 

 

 

 

 

 

 

 

 

發佈了38 篇原創文章 · 獲贊 45 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章