做爲一個高可靠性、高性能、列存儲、可伸縮、實時讀寫的分佈式數據庫系統,HBase在大數據生態系統中佔據重要的地位。咱們必需要了解其基本原理和概念,一方面能夠對數據分析工做中排查問題有比較大的幫助,另外一方面方便咱們與他人溝通交流。html
HbaseS的特色是什麼?面試
1.hbase是一個分佈式的,基於列式存儲的數據庫,基於hadoop的hdfs存儲,zookeeper進行管理。shell
2.hbase 適合存儲半結構化或非結構化的數據,好比數據結構字段不夠肯定或者雜亂無章很難按照一個概念去抽取的數據。數據庫
3.hbase的存儲效率比較高,爲null的數據不會被存儲。緩存
4.hbase的表包含rowKey、列族和列,存儲數據的最小單元是單元格,單元格包含數據及其對應的寫入時間戳,新寫入數據時,附帶寫入時間戳,能夠查詢到以前寫入的多個版本。安全
5.hbase是主從結構,hmaster做爲主節點,hregionServer做爲從節點。bash
Hbase的數據存儲模型服務器
答:Hbase 中的每張表都經過行鍵(rowkey)按照必定的範圍被分割成多個子表(HRegion),默認一個 HRegion 超過 256M 就要被分割成兩個,由 HRegionServer 管理,管理哪些 HRegion由 Hmaster 分配。HRegion 存取一個子表時,會建立一個 HRegion 對象,而後對錶的每一個列族(Column Family)建立一個 store 實例,每一個 store 都會有 0 個或多個 StoreFile 與之對應,每一個 StoreFile 都會對應一個 HFile, HFile 就是實際的存儲文件;一個 HRegion 還擁有一個 MemStore 實例。 網絡
描述下HBase的架構?數據結構
答:HBase遵照主從架構的技術,由一個主HMaster和若干個從HRegionServer組成。HBase中的一張表的數據由若干個HRegion組成,也就是說每個HRegion負責管理一張表中的一段數據,HRegion都是分佈式的存在於HRegionServer中,因此說HRegion是HBase表中數據分佈式存儲的單位。那麼一個HRegion中又是由若干個column family的數據組成;在HRegion中每一個column family數據由一個store管理,每一個store包含了一個memory store和若干個HFile組成,HFile的數據最終會落地到HDFS文件中,因此說HBase依賴HDFS。
在HBase中還有一部分元數據信息,好比HMaster的狀態信息、HRegionServer的狀態信息以及HRegion的狀態信息等,這些信息都是存儲在zookeeper集羣中。請看下圖便於理解。
描述Hbase中scan和get的功能以及實現的異同
答:Get的功能是精準查找,按指定RowKey 獲取惟一一條記錄。Scan的功能是範圍查找,按指定的條件獲取一批記錄。實際上它們的實現是同樣的,get操做就是一種特殊的scan(begin和end相同的scan操做)。並且hbase讀數據的操做都是scan,代碼級別實現的是scan,並無特別針對get的操做。
請詳細描述Hbase中一個Cell的結構?
答:cell:由{row key, column(=<family> + <label>), version}惟一肯定的單元,cell中的數據是沒有類型的,所有是字節碼形式存儲。
簡述compact
答:在 hbase 中每當有 memstore 數據 flush 到磁盤以後,就造成一個 storefile,當 storeFile 的數量達到必定程度後,就須要將 storefile 文件來進行 compaction 操做。
Compact 的做用:
1>.合併文件
2>.清除過時,多餘版本的數據
3>.提升讀寫數據的效率
HBase 中實現了兩種 compaction 的方式:minor and major。
這兩種 compaction 方式的區別是:
一、 Minor 操做只用來作部分文件的合併操做以及包括 minVersion=0,而且設置 ttl 的過時版本清理,不作任何刪除數據、多版本數據的清理工做。
二、 Major 操做是對 Region 下的 HStore 下的全部 StoreFile 執行合併操做,最終的結果是整理合並出一個文件。
描述HBase HMaster HA故障轉移過程?
答:宕機分爲 HMaster 宕機和 HRegisoner 宕機,若是是 HRegisoner 宕機, HMaster 會將其所管理的 region 從新分佈到其餘活動的 RegionServer 上,因爲數據和日誌都持久在 HDFS中,該操做不會致使數據丟失。因此數據的一致性和安全性是有保障的。若是是 HMaster 宕機,會經過Zookeeper 的 Master Election 機制從新選出一個正在運行的Master 進程做爲活躍節點,繼續提供服務。
Hbase讀寫流程
讀:
① HRegionServer 保存着 meta 表以及表數據,要訪問表數據,首先 Client 先去訪問zookeeper,從 zookeeper 裏面獲取 meta 表所在的位置信息,即找到這個 meta 表在哪一個HRegionServer 上保存着。
② 接着 Client 經過剛纔獲取到的 IP 訪問對應的HRegionServer,獲取到 Meta 表中存放的元數據。
③ Client 經過元數據中存儲的信息,訪問對應的 HRegionServer,而後掃描所在HRegionServer 的 Memstore 和 Storefile 來查詢數據。
④ 最後 HRegionServer 把查詢到的數據響應給 Client。
寫:
① Client 先訪問 zookeeper,找到 Meta 表,並獲取 Meta 表元數據。
② 肯定當前將要寫入的數據所對應的 HRegion 和 HRegionServer 服務器。
③ Client 向該 HRegionServer 服務器發起寫入數據請求,而後 HRegionServer 收到請求並響應。
④ Client 先把數據寫入到 HLog,以防止數據丟失。
⑤ 而後將數據寫入到 Memstore。
⑥ 若是 HLog 和 Memstore 均寫入成功,則這條數據寫入成功
⑦ 若是 Memstore 達到閾值,會把 Memstore 中的數據 flush 到 Storefile 中。
⑧ 當 Storefile 愈來愈多,會觸發 Compact 合併操做,把過多的 Storefile 合併成一個大的 Storefile。
⑨ 當 Storefile 愈來愈大,Region 也會愈來愈大,達到閾值後,會觸發 Split 操做,將Region 一分爲二。
HBase適用於怎樣的情景?
1.半結構化或非結構化數據:
對於數據結構字段不夠肯定或雜亂無章很是難按一個概念去進行抽取的數據適合用HBase,由於HBase支持動態添加列。
2.記錄很稀疏:
關係型數據庫的列的數量是相對穩定的,null值也會佔據存儲位,爲null的列浪費了存儲空間。HBase爲null的Column不會被存儲,這樣既節省了空間又提升了讀性能。
3.多版本數據:
依據Row key和Column key定位到的Value可以有隨意數量的版本號值,所以對於須要存儲變更歷史記錄的數據,用HBase是很方便的。好比某個用戶的Address變動,其變動記錄也許也是具備研究意義的。
4.僅要求最終一致性:
對於數據存儲事務的要求不像金融行業和財務系統這麼高,只要保證最終一致性就行。
5.要求高可用性和支持海量數據以及很大的瞬間寫入量:
1)WAL解決高可用,支持PB級數據,寫入性能高。
2)索引插入比查詢操做更頻繁的狀況。好比,對於歷史記錄表和日誌文件。(HBase的寫操做更加高效)。
描述HBase的rowKey的設計原則?
① Rowkey 長度原則
Rowkey 是一個二進制碼流,通常是10~100個字節,建議越短越好,不超過16字節爲宜。
② Rowkey 散列原則
若是Rowkey 是按時間戳的方式遞增,不要將時間放在二進制碼的前面,建議將Rowkey的高位做爲散列字段,由程序循環生成,低位放時間字段,這樣將提升數據均衡分佈在每一個Regionserver 實現負載均衡的概率。若是沒有散列字段,首字段直接是時間信息將產生全部新數據都在一個 RegionServer 上堆積的熱點現象,這樣在作數據檢索的時候負載將會集中在個別 RegionServer,下降查詢效率。
③ Rowkey 惟一原則
必須在設計上保證其惟一性。
如何提升HBase集羣的讀寫性能
1.開啓 bloomfilter 過濾器,開啓 bloomfilter 比沒開啓要快 三、4 倍。
2.Hbase 對於內存有特別的需求,在硬件容許的狀況下配足夠多的內存給它。
3.增大 RPC 數量,經過修改 hbase-site.xml 中的 hbase.regionserver.handler.count 屬性,能夠適當的放大RPC 數量,默認值爲 10 有點小。
HRegionServer宕機後,此臺機器的region數據的轉移過程?
描述HBase中region過小和region太大帶來的問題?
答:Region太小會發生屢次compaction,將數據讀一遍並重寫一遍到hdfs上,佔用io,region過大會形成屢次split,region 會下線,影響訪問服務.
HBase的關鍵組件是什麼?
1)Table:可理解爲傳統數據庫中的一個表,但由於SchemaLess的設計,它較之傳統數據庫的表而言,在設計上更加靈活。
2)Region:將表橫向切割爲一個個子表,子表在HBase中被稱之爲Region。
3)RegionServer:數據服務進程,Region必須部署在某一個RegionServer上才能夠提供讀寫服務。
4)HFile:HBase數據庫在底層分佈式文件系統中的文件組織形式。
5)Column Family:一些列的集合。不一樣的Column Family數據被存儲在不一樣的路徑中。MemStore:用來在內存中緩存必定大小的數據,達到設定的閾值後批量寫入到底層文件系統中。數據是有序的。
下圖清晰的展現了Table,Region,RegionServer,HFile,MemStore,Column Family在HBase的邏輯關係。
Hbase中有哪些數據操做命令類型?
在HBase中什麼是列族?
解釋Hbase如何實際刪除一行
介紹下RowFilter
Filter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(rowKeyValue)));Scan scan = new Scan();scan.setFilter(rowFilter)複製代碼
在上面例子中,比較符爲EQUAL,比較器爲BinaryComparator 複製代碼
Region如何預建分區
create 't1', 'f1',SPLITS=>['10','20','30']create 't1','f1',SPLITS_FILE =>'splits.txt'複製代碼
2)Java API建立一個byte[][] splitKeys = {{1,2,3},{4,5,6}}admin.createTable(tableDesc,splitKeys)複製代碼
Hbase中有多少數據操做命令類型
create_namespace 'test_ns'複製代碼
在新的namespace中建立表:
//test表中有2個column familycreate 'test_ns:test','f','e'複製代碼
put 'test_ns:test','rowkey-1','f:a','value1'put 'test_ns:test','rowkey-1','e:b','value2'複製代碼
//刪除一列delete 'test_ns:test','rowkey-1','f:a'//刪除一行deleteall 'test_ns:test','rowkey-1'複製代碼
put 'test_ns:test','rowkey-1','f:a','value1'複製代碼
get 'test_ns:test','rowkey-1'get 'test_ns:test','rowkey-1',{COLUMN => 'f:a'}複製代碼
使用HBase shell建立一張表,並對其進行增刪改查?
簡述下HBASE中split機制
參考答案:HBase中爲了使得HRegion不至於太大(默認是10G),那麼當HRegion太大的時候,就須要對HRegion進行切分(split)。
split有三種方式:
1)pre-split(預切分),能夠根據傳入的參數計算出HBase表須要存儲多大的數據,在建立表的時候預先給表切分好HRegion。以下面的例子:
//根據參數給表預先切分4個HRegioncreate 'test_pre_split','f',split => ['10','20','30']複製代碼
2)Auto-split(自動切分),當一個Region達到必定的大小的時候,這個Region會自動切分紅兩個Region。3)Force-split(手工切分),經過命令手動的去切分某個須要切分的HRegion。能夠在hbase shell中經過命令split table_name,rowkey;還能夠在HBase的Web UI上進行切分。複製代碼
Hbase如何藉助其餘技術實現二級索引
衆所周知,在hbase中使用rowKey檢索數據是很是快速的,可是若是想要根據某一列進行數據的檢索,速度就會慢不少,這是由於hbase沒有二級索引,對某一列進行檢索就須要作全表掃描。
明白了這一點,那麼咱們就能夠藉助其餘技術來實現hbase的二級索引功能,最經常使用的技術手段即是,藉助Solr或者ElasticSearch。它的核心思想是,在數據寫入hbase的同時,將rowKey以及須要用於檢索的列寫入Solr或者ElasticSearch創建倒排索引,那麼咱們在對某一列進行檢索時,能夠先去Solr或者ElasticSearch中檢索出對應的rowKey,而後再去Hbase中進行查找,這樣兩段式查找,就避免了全表掃描,大大提升了檢索的速度。
RowKey設計實例
一款視頻APP的播放行爲統計數據,須要查詢天天每一個視頻類型播放量TopN的視頻(播放量從高到低排序),如何設計rowkey?
需求分析:首先咱們存儲的數據是每一個視頻在某天的播放量統計數據,咱們讀取數據的場景是獲取某天某個視頻類型的播放量TopN(能夠是Top十、Top100、Top200等)視頻列表,那麼咱們的設計思路能夠是將RowKey分爲三段,第一段存儲播放日期,第二段存放視頻類型,第三段存儲倒排的播放量。這樣在檢索時,咱們能夠設置過濾RowKey前綴是播放日期+視頻類型,而後提取前N條記錄。
參考示例:key_day + content_type + (99999999-play_num)
說明:key_day是播放日期,content_type是視頻類型,play_num是視頻的播放量,用(9999999999-play_num)是爲了反轉排序,將播放量大的視頻排在前面。須要注意的是,RowKey每段的長度必定要保持一致,若是長度不夠,須要用其餘字符補足位數。
這樣設計rowkey就能夠知足天天每一個視頻類型的TopN查詢,查詢的時候要配合前綴過濾器PrefixFilter進行升序排序,獲得的就是一個播放量倒排的視頻列表。
小結
本篇HBase面試指南,結合網絡上的經典考題和工做中總結改編的題目一共24道,考點涉及了基本概念和基本操做以及原理方面的內容,但願讀者能夠查漏補缺,完善HBase面試知識點。
[1] HBase面試題 做者: 腳丫先生https://blog.csdn.net/shujuelin/article/details/89035272[2] Hbase相關面試題 做者: haixwanghttps://blog.csdn.net/HaixWang/article/details/79514886[3] HBase面試問題 做者:魚果說https://www.cnblogs.com/yuguoshuo/p/6265639.html[4] Hbase面試問題與解答 做者:飛禹德蒙https://www.songma.com/news/txtlist_i2275v.html[5] 大數據面試題-HBase 做者:jiangw-Tonyhttp://www.cocoachina.com/articles/30334[6] hadoop、hbase、hive等相關面試問題 做者:syssp-Fhttps://download.csdn.net/download/reyzelamp/10484333[7]【面試】HBase面試題 做者:_和_https://www.jianshu.com/p/e405ed781cab複製代碼