Hbase篇之面試題

1.HBase的基本介紹

a.Hbase是建立在hdfs之上的一個數據庫,
b.不支持join等SQL複雜操作
c.支持的數據類型:byte[],
d.依靠橫向擴展,一個表可以有上十億行,上百萬列。
e.面向列(族)的存儲和權限控制 
f.對於爲空(null)的列,並不佔用存儲空間,是一個稀疏表。

2.HBASE的適用場景

海量數據、精確查詢、快速返回
海量數據:指的是數據量的背景
精確查詢:業務場景
快速返回:是業務對時效性的要求

3.Hbase和Hadoop之間的關係

HDFS:
海量數據存儲,適合一次性掃描大量數據。
適合一次寫入多次讀取
不適合頻繁更新的數據

HBASE:
適用一次掃描少量數據。
適合多次寫入多次讀取
支持數據更新
支持刪除數據

4.Hbase與RDBMS的關係

RDBMS :
支持SQL查詢
支持事務
支持Join

HBASE :
不支持SQL查詢
不支持事務
不支持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) 
hbase在最初設計的時候就考慮了擴展性。 
4、高併發 
這裏說的高併發,主要是在併發的情況下,Hbase的單個IO延遲下降並不多 
5、稀疏 
在列數據爲空的情況下,是不會佔用存儲空間的。 

18.hbase用途

主要用來存儲結構化和半結構化的鬆散數據。
hdfs:什麼都能存儲
MR:不能做快速返回
最初的大數據,只有hdfs+ MR ,此時衆多的企業有的數據依然是結構化數據(存儲數據庫內)。
大數據內沒有提供快速查詢的技術。需求:就是在大數據內添加一個能夠處理(快速查詢)結構化數據的組件。
hbase在最初設計的時候就考慮了擴展性。hbase具有很好的擴展性。

19.hbase數據的寫入

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

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

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

​	5  若Memstore達到閾值,會把Memstore中的數據flush到Storefile中

​	6  Storefile數量達到閾值(默認3個)時,會觸發Compact合併操作,把過多的Storefile合併成一個大的Storefile

​	說明:支持數據更新(僞更新),這裏的更新實際上時數據的新添加。

20. 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提供服務。

21.regionserver的上線

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

​1、region server啓動時,會首先在zookeeper上的/hbase/rs  目錄下建立代表自己的znode。
2、master訂閱了/hbase/rs 目錄上的變更消息,當/hbase/rs 目錄下的文件出現新增或刪除操作時,master可以得到來自zookeeper的實時通知。
3、一旦region server上線,/hbase/rs 有新增node,    zookeeper  通知master,master能馬上得到消息.

22.regionserver的下線

​1、當region server下線時,它和zookeeper的會話斷開
2、zookeeper而自動釋放代表這臺server的文件上的node
3、 zookeeper  通知master, master得知那個節點下線。
4、master將這臺region server的region分配給其它還活着的regionserver.

23. Hmaster的上線

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

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

​3   和每個region server通信,獲得當前已分配的region和region server的對應關係。

​4   描.META.表數據,計算得到當前還未分配的region,將他們放入待分配region列表。

問題1:多個hmaster如何確定哪個是真正的master

​		從zookeeper上獲取唯一 一個代表active master的鎖

問題2:如何獲取集羣當前可用的regionserver 列表

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

問題3:master 如何獲得region和regionserver之間的對應關係

​	master和每個region server通信,獲得當前已分配的region和region server的對應關係。

問題4 :master 如何獲得還未分配的region

​		描.META.表數據,計算得到當前還未分配的region.

23. Hmaster下線

​	master只維護表和region的元數據,不參與表數據IO的過程,master下線短時間內對整個hbase集羣沒有影響。

​	長時間下線的影響:

無法創建刪除表,無法修改表的schema,無法進行region的負載均衡,
無法處理region 上下線,無法進行region的合併,(region的split可以正常進行)

master下線,啓用Zookeeper的選舉機制,確定新的master,  新master執行上線流程。

24. Hbase三個重要的機制

1、flush機制

​ hbase.regionserver.global.memstore.size: 默認;大小的40%

regionServer的全局memstore的大小(多個region),超過該大小會觸發flush到磁盤的操作,flush時會阻塞客戶端讀寫。

​ hbase主要用於海量數據的快速讀寫。讀寫的總內存是堆內存的80%,讀佔用堆內存的40%,寫佔用堆內存的40%,想提高哪個業務場景的效率,就提高相應的百分比。

​ hbase.hregion.memstore.flush.size: 默認:128M(單個region裏memstore的緩存大小)

​ hbase.regionserver.optionalcacheflushinterval :默認:1h

集羣調優:

​ hbase.regionserver.global.memstore.size.lower.limit: 默認0.95

​ hbase.hregion.preclose.flush.size:5M

​ hbase.hstore.compactionThreshold:默認: 3個

2、compact機制

​ 當flush文件的數量達到3個,把小的storeFile文件合併成大的Storefile文件

3、split機制

​ 當Region達到閾值(默認10G),會把過大的Region一分爲二

25.HBase的預分區

\* 增加數據讀寫效率: 默認方式所有數據存在一個節點上,預分區將數據分散到多各節點上。

\* 負載均衡,防止數據傾斜: 數據的rowkey分成多個區間,每個區間就是一個region,數據寫入時,寫入自己所在的範圍的region

\* 方便集羣容災調度region:  將數據分散存儲到了多個region中,region的粒度更小

\* 優化Map數量



原始(未使用與分區)的分區(region)是如何實現的??

​	數據表在創建時,只有一個region,隨着數據量的增加,region之間變大,達到閾(10g)值分裂成兩個region.

一個region只能在一個regionserver內,此時,數據的讀寫都依賴於一個節點(或少量的節點)

​	大量數據的讀取都在一個節點。如何優化??

​	方案:在建表時人爲指定這個表含有多個region(不使用默認10G   一分割)。

​	create 'staff001','info','partition1',SPLITS => ['1000','2000','3000','4000','5000','6000','7000','8000']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章