hbase面試題


1.hbase的特點是什么?

 答:1)hbase是一個分布式的,基於列式存儲的數據庫,基於hadoop的hdfs存儲,zookeeper進行管理。

     2)hbase 適合存儲半結構化或非結構化的數據,對於數據結構字段不夠確定或者雜亂無章很難按照一個概念去抽取的數據。

     3)hbase為null的數據不會被存儲

   4)基於的表包含rowKey,時間戳和列族,新寫入數據時,時間戳更新,同時可以查詢到以前的版本

   5)hbase是主從結構,hmaster作為主節點,hregionServer作為從節點

2.hbase如何導入數據?

  使用 MapReduce Job 方式,根據 Hbase API 編寫 java 腳本,將文本文件用文件流的方式截取,然后存儲到多個字符串數組中,在 put 方法下,通過對表中的列族進行 for 循環遍歷列名,用 if 判斷列名后進行 for 循環調用 put.add 的方法對列族下每一個列進行設值,每個列族下有幾個了就賦值幾次!沒有表先對先創建表。 

 3.hbase 的存儲結構?   

  答: Hbase 中的每張表都通過行鍵(rowkey)按照一定的范圍被分割成多個子表(HRegion),默認一個 HRegion 超過 256M 就要被分割成兩個,由 HRegionServer 管理,管理哪些 HRegion由 Hmaster 分配。 HRegion 存取一個子表時,會創建一個 HRegion 對象,然后對表的每個列族(Column Family)創建一個 store 實例,每個 store 都會有 0 個或多個 StoreFile 與之對應,每個 StoreFile 都會對應一個 HFile, HFile 就是實際的存儲文件,因此,一個 HRegion 還擁有一個 MemStore 實例。 

4.Hbase hive 有什么區別hive hbase 的底層存儲是什么?hive是產生的原因是什么habase是為了彌補hadoop的什么缺陷?

答案:共同點:1.hbase與hive都是架構在hadoop之上的。都是用hadoop作為底層存儲

   區別:2.Hive是建立在Hadoop之上為了減少MapReducejobs編寫工作的批處理系統,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計算框架。

 

5.解釋下 hbase 實時查詢的原理

  答:實時查詢,可以認為是從內存中查詢,一般響應時間在 1 秒內。 HBase 的機制是數據先寫入到內存中,當數據量達到一定的量(如 128M),再寫入磁盤中, 在內存中,是不進行數據的更新或合並操作的,只增加數據,這使得用戶的寫操作只要進入內存中就可以立即返回,保證了 HBase I/O 的高性能。 

 6.列簇怎么創建比較好?(<=2)

答: rowKey 最好要創建有規則的 rowKey,即最好是有序的。 HBase 中一張表最好只創建一到兩個列族比較好,因為 HBase 不能很好的處理多個列族。

 7.描述 Hbase 中 scan 和 get 的功能以及實現的異同.

1.按指定RowKey 獲取唯一一條記錄, get方法(org.apache.hadoop.hbase.client.Get)Get 的方法處理分兩種 : 設置了 ClosestRowBefore 和沒有設置的 rowlock .主要是用來保證行的事務性,即每個 get 是以一個 row 來標記的.一個 row 中可以有很多 family 和 column.

2.按指定的條件獲取一批記錄, scan 方法(org.apache.Hadoop.hbase.client.Scan)實現條件查詢功能使用的就是 scan 方式.1)scan 可以通過 setCaching 與 setBatch 方法提高速度(以空間換時間); 2)scan 可以通過 setStartRow 與 setEndRow 來限定范圍([start, end]start 是閉區間, end 是開區間)。范圍越小,性能越高。3)scan 可以通過 setFilter 方法添加過濾器,這也是分頁、多條件查詢的基礎。

3.全表掃描,即直接掃描整張表中所有行記錄 

8.請詳細描述 Hbase 中一個 Cell 的結構

HBase 中通過 row 和 columns 確定的為一個存貯單元稱為 cell。Cell:由{row key, column(=<family> + <label>), version}是唯一確定的單元 cell中的數據是沒有類型的,全部是字節碼形式存貯 

 

9.請描述 Hbase 中 scan 對象的 setCache 和 setBatch 方法的使用. 

cache:

 在默認情況下,如果你需要從hbase中查詢數據,在獲取結果ResultScanner時,hbase會在你每次調用ResultScanner.next()操作時對返回的每個Row執行一次RPC操作。即使你使用ResultScanner.next(int nbRows)時也只是在客戶端循環調用RsultScanner.next()操作,你可以理解為hbase將執行查詢請求以迭代器的模式設計,在執行next()操作時才會真正的執行查詢操作,而對每個Row都會執行一次RPC操作。

     因此顯而易見的就會想如果我對多個Row返回查詢結果才執行一次RPC調用,那么就會減少實際的通訊開銷。這個就是hbase配置屬性“hbase.client.scanner.caching”的由來,設置cache可以在hbase配置文件中顯示靜態的配置,也可以在程序動態的設置。
 
     cache值得設置並不是越大越好,需要做一個平衡。cache的值越大,則查詢的性能就越高,但是與此同時,每一次調用next()操作都需要花費更長的時間,因為獲取的數據更多並且數據量大了傳輸到客戶端需要的時間就越長,一旦你超過了maximum heap the client process 擁有的值,就會報outofmemoryException異常。當傳輸rows數據到客戶端的時候,如果花費時間過長,則會拋出ScannerTimeOutException異常。
 
batch
     在cache的情況下,我們一般討論的是相對比較小的row,那么如果一個Row特別大的時候應該怎么處理呢?要知道cache的值增加,那么在client process 占用的內存就會隨着row的增大而增大。在hbase中同樣為解決這種情況提供了類似的操作:Batch。可以這么理解,cache是面向行的優化處理,batch是面向列的優化處理。它用來控制每次調用next()操作時會返回多少列,比如你設置setBatch(5),那么每一個Result實例就會返回5列,如果你的列數為17的話,那么就會獲得四個Result實例,分別含有5,5,5,2個列。
 
下面會以表格的形式來幫助理解,假設我們擁有10Row,每個row擁有2個family,每個family擁有10個列。(也就是說每個Row含有20列)
caching batch Results RPCs Notes
1 1 200 201 額外的一個RPC是用來判斷scan是否完成
200 1 200 2  
2000 100 10 1 超過的部分沒有用處,但是判斷scan也在那一個RPC 中完成
2 100 10 6 10/2 +1 (額外的判斷開銷)
2 10 20 11  
5 100 10 3  
5 20 10 3  
10 10 20 3  
 
RPCs=(Rows* Cols per Row) / Min(Cols per Row, Batch size) / Scanner caching
 
上圖引用自hbase權威指南,是用來表示一個RPC call的構成。

10.簡述 HBASE 中 compact 用途是什么,什么時候觸發,分為哪兩種,有什么區別,有哪些相關配置參數?

  在 hbase 中每當有 memstore 數據 flush 到磁盤之后,就形成一個 storefile,當 storeFile 的數量達到一定程度后,就需要將 storefile 文件來進行 compaction 操作。

  Compact 的作用:

          1>.合並文件

          2>.清除過期,多余版本的數據

          3>.提高讀寫數據的效率

  HBase 中實現了兩種 compaction 的方式:

  minor and major. 這兩種 compaction 方式的區別是:

    1、 Minor 操作只用來做部分文件的合並操作以及包括 minVersion=0 並且設置 ttl 的過期版本清理,不做任何刪除數據、多版本數據的清理工作。

    2、 Major 操作是對 Region 下的 HStore 下的所有 StoreFile 執行合並操作,最終的結果是整理合並出一個文件。簡述 Hbase filter 的實現原理是什么?結合實際項目經驗,寫出幾個使用 filter 的場景HBase 為篩選數據提供了一組過濾器,通過這個過濾器可以在 HBase 中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列名,時間戳定位)。 RowFilter、 PrefixFilter。。。hbase的filter是通過scan設置的,所以是基於scan的查詢結果進行過濾.過濾器的類型很多,但是可以分為兩大類——比較過濾器,專用過濾器過濾器的作用是在服務端判斷數據是否滿足條件,然后只將滿足條件的數據返回給客戶端;如在進行訂單開發的時候,我們使用rowkeyfilter過濾出某個用戶的所有訂單

 11. Hbase 內部是什么機制

  在 HBase 中無論是增加新行還是修改已有行,其內部流程都是相同的。 HBase 接到命令后存下變化信息,或者寫入失敗拋出異常。默認情況下,執行寫入時會寫到兩個地方:預寫式日志(write-ahead log,也稱 HLog)和 MemStore。 HBase 的默認方式是把寫入動作記錄在這兩個地方,以保證數據持久化。只有當這兩個地方的變化信息都寫入並確認后,才認為寫動作完成。MemStore 是內存里的寫入緩沖區, HBase 中數據在永久寫入硬盤之前在這里累積。當MemStore 填滿后,其中的數據會刷寫到硬盤,生成一個 HFile。 HFile 是 HBase 使用的底層存儲格式。 HFile 對應於列族,一個列族可以有多個 HFile,但一個 HFile 不能存儲多個列族的數據。在集群的每個節點上,每個列族有一個 MemStore。大型分布式系統中硬件故障很常見, HBase 也不例外。設想一下,如果 MemStore 還沒有刷寫,服務器就崩潰了,內存中沒有寫入硬盤的數據就會丟失。 HBase 的應對辦法是在寫動作完成之前先寫入 WAL。 HBase 集群中每台服務器維護一個 WAL 來記錄發生的變化。WAL 是底層文件系統上的一個文件。直到 WAL 新記錄成功寫入后,寫動作才被認為成功完成。這可以保證 HBase 和支撐它的文件系統滿足持久性。大多數情況下, HBase 使用Hadoop 分布式文件系統(HDFS)來作為底層文件系統。如果 HBase 服務器宕機,沒有從 MemStore 里刷寫到 HFile 的數據將可以通過回放WAL 來恢復。你不需要手工執行。 Hbase 的內部機制中有恢復流程部分來處理。每台HBase 服務器有一個 WAL,這台服務器上的所有表(和它們的列族)共享這個 WAL。你可能想到,寫入時跳過 WAL 應該會提升寫性能。但我們不建議禁用 WAL,除非你願意在出問題時丟失數據。如果你想測試一下,如下代碼可以禁用 WAL: 注意:不寫入 WAL 會在 RegionServer 故障時增加丟失數據的風險。關閉 WAL,出現故障時 HBase 可能無法恢復數據,沒有刷寫到硬盤的所有寫入數據都會丟失。 

12.HBase 宕機如何處理

答:宕機分為 HMaster 宕機和 HRegisoner 宕機,如果是 HRegisoner 宕機, HMaster 會將其所管理的 region 重新分布到其他活動的 RegionServer 上,由於數據和日志都持久在 HDFS中,該操作不會導致數據丟失。所以數據的一致性和安全性是有保障的。如果是 HMaster 宕機, HMaster 沒有單點問題, HBase 中可以啟動多個 HMaster,通過Zookeeper Master Election 機制保證總有一個 Master 運行。即 ZooKeeper 會保證總會有一個 HMaster 在對外提供服務。

 13.導致Hbase掛掉的場景

導致Hbase掛掉的場景
HMaster
HMaster會出現異常(執行abort())停止的場景如下:
1.zk異常導致的master停止服務是最常見的場景,涉及操作包含但不限於以下:
  a)Zk鏈接超時,超時時間通過zookeeper.session.timeout配置,默認為3分鍾, 如果fail.fast.expired.active.master配置的值為false(默認為false),則不會立即abort,而是會嘗試恢復zk的過期session;
  b)在打開region后,需要從zk中刪除opened節點,如果zk有該節點,但是刪除失敗;
  c)在split region過程中,從zk刪除split節點時;
  d)Master節點改變時;
  e)從zk中創建unassigned節點時;
  f)在下線disabled的regoin時,從zk中刪除disabled的region如果發生zk異常;
  g)還有很多操作zk的節點時如果出現異常。
2.在assign時,如果設置region為offlined狀態,但是region之前的狀態不是closed或者offlined;
3.在assign時,如果無法從.META.表中讀取region信息;
4.把新的hbase集群加入到正在運行的hbase集群時,如果zk的/hbase/unassigned節點沒有數據;
5.使用線程池批量分配region時,如果出現未被捕獲的異常,實現方式如下:
6.在啟動master的服務線程時,出現了異常;
7.在hdfs中檢查hbase日志路徑時,發現了dead的server時,需從hdfs中讀出log,如果出現io異常需要檢查hdfs文件系統,如果fsOk狀態為true,但是通過FSUtils工具類進行檢查時出現io異常;
8.在校驗並且分配-ROOT-的region時,如果zk異常,或者其它異常(其它異常會重試10次),比如:“-ROOT- is onlined on the dead server”。 

HRegionServer
HRegionServer會出現異常停止(執行abort())服務的場景如下:
1.在讀寫hdfs時如果出現IOException異常,此時會發起hdfs的文件系統檢查(checkFileSystem)1.          
2.Regionserver的服務線程出現了未捕獲異常;
3.在啟動HRegionServer時出現異常;
4.在進行HLog回滾時,出現異常;
5.在flush memstore時,如果持久化失敗,會重啟RS,在重啟中把hlog的內容重新加載到memstore;
6.出現zk異常,包括但不限於以下場景:
  a)Zk鏈接超時,超時時間通過zookeeper.session.timeout配置,默認為3分鍾,與master不同,如果zk操作不會重試;
  b)啟動HRegionServer時出現KeeperException異常; 
  c)在進行split操作時,如果出現異常會進行回滾操作,在回滾過程中需要從zk中刪除region的spliting狀態,如果刪除時出現KeeperException或者回滾的其它操作出現異常;
  d)在打開region時,出現了KeeperException異常;
  e)在進行hbase集群復制時,很多與zk交互的操作出現KeeperException異常時均會導致abort;
7.在close region時,如果出現異常,比如:不能成功的flush memstore;
8.Flush memstore時,如果HLog發現該region已經在flush則會強制終止JVM,采用的是Runtime.getRuntime().halt(1)方法,該方法不會執行正常退出的關閉鈎子,從而不會flush RS的所有region,也不會遷移region,只有等待ZK的session超時后master才會發現該RS不可用,做遷移工作。

總結
Hbase掛掉的可能性有很多,主要由zk或者hdfs的問題導致,因此zk、hdfs的可用對於hbase極其重要,關於zk:
1.zk如果停止了服務則在很多時候會導致master、rs掛掉,hbase集群基本上就失去了服務的能力,因此zk一定要是穩定可靠的,當client已經於rs建立了鏈接,這時zk掛掉,如果不進行split等小數與zk交互失敗會導致觸發rs的abort()的操作時rs還是可以提供服務的;
2.如果rs/master進行了長時間的gc或者改動了服務器時間,導致出現zk的session超時會導致rs/master停止服務,目前已經出現了2次因為服務器時間變化導致hbase停止服務的事故;
3.別輕易人為改變zk的hbase節點數據,master/rs在進行很多操作時會比較依賴zk的數據,如果發現不符合預期可能會導致master/rs停止服務,尤其是master。
Master通過ZK知道RS是否可用,一般情況下RS在停止服務時均會正常退出,在正常退出時會從ZK中刪除/hbase/rs/$regionserver的節點,Master會監聽該節點的被刪除,從而較快的(速度取決於所有region關閉時間)對該RS負責的region進行重新分配,如果是強制退出,比如 kill -9或者出現HRegionServer掛掉的第8條時則只有等待ZK的session超時時才會刪除RS在ZK的節點(RS在ZK中添加節點時采用的是CreateMode.EPHEMERAL模式,該模式創建的節點會在session關閉時自動刪除),那時Master才會進行重新assign。
Kill RS的進程也是正常退出(不能使用kill -9強制退出),RS使用Runtime的addShutdownHook方法注冊了jvm關閉鈎子,在關閉鈎子中會執行RS的退出邏輯,實際上hbase-daemon.sh的停止RS就是采用kill。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM