答:1)hbase是一個分佈式的,基於列式存儲的數據庫,基於hadoop的hdfs存儲,zookeeper進行管理。java
2)hbase 適合存儲半結構化或非結構化的數據,對於數據結構字段不夠肯定或者雜亂無章很難按照一個概念去抽取的數據。數據庫
3)hbase爲null的數據不會被存儲apache
4)基於的表包含rowKey,時間戳和列族,新寫入數據時,時間戳更新,同時能夠查詢到之前的版本數組
5)hbase是主從結構,hmaster做爲主節點,hregionServer做爲從節點安全
使用 MapReduce Job 方式,根據 Hbase API 編寫 java 腳本,將文本文件用文件流的方式截取,而後存儲到多個字符串數組中,在 put 方法下,經過對錶中的列族進行 for 循環遍歷列名,用 if 判斷列名後進行 for 循環調用 put.add 的方法對列族下每個列進行設值,每一個列族下有幾個了就賦值幾回!沒有表先對先建立表。 服務器
答: Hbase 中的每張表都經過行鍵(rowkey)按照必定的範圍被分割成多個子表(HRegion),默認一個 HRegion 超過 256M 就要被分割成兩個,由 HRegionServer 管理,管理哪些 HRegion由 Hmaster 分配。 HRegion 存取一個子表時,會建立一個 HRegion 對象,而後對錶的每一個列族(Column Family)建立一個 store 實例,每一個 store 都會有 0 個或多個 StoreFile 與之對應,每一個 StoreFile 都會對應一個 HFile, HFile 就是實際的存儲文件,所以,一個 HRegion 還擁有一個 MemStore 實例。 session
答案:共同點: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計算框架。
答:實時查詢,能夠認爲是從內存中查詢,通常響應時間在 1 秒內。 HBase 的機制是數據先寫入到內存中,當數據量達到必定的量(如 128M),再寫入磁盤中, 在內存中,是不進行數據的更新或合併操做的,只增長數據,這使得用戶的寫操做只要進入內存中就能夠當即返回,保證了 HBase I/O 的高性能。
答: rowKey 最好要建立有規則的 rowKey,即最好是有序的。 HBase 中一張表最好只建立一到兩個列族比較好,由於 HBase 不能很好的處理多個列族。
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.全表掃描,即直接掃描整張表中全部行記錄
HBase 中經過 row 和 columns 肯定的爲一個存貯單元稱爲 cell。Cell:由{row key, column(=<family> + <label>), version}是惟一肯定的單元 cell中的數據是沒有類型的,所有是字節碼形式存貯
在默認狀況下,若是你須要從hbase中查詢數據,在獲取結果ResultScanner時,hbase會在你每次調用ResultScanner.next()操做時對返回的每一個Row執行一次RPC操做。即便你使用ResultScanner.next(int nbRows)時也只是在客戶端循環調用RsultScanner.next()操做,你能夠理解爲hbase將執行查詢請求以迭代器的模式設計,在執行next()操做時纔會真正的執行查詢操做,而對每一個Row都會執行一次RPC操做。
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 |
在 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 filter 的實現原理是什麼?結合實際項目經驗,寫出幾個使用 filter 的場景HBase 爲篩選數據提供了一組過濾器,經過這個過濾器能夠在 HBase 中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操做,也就是說過濾器最終可以篩選的數據可以細化到具體的一個存儲單元格上(由行鍵,列名,時間戳定位)。 RowFilter、 PrefixFilter。。。hbase的filter是經過scan設置的,因此是基於scan的查詢結果進行過濾.過濾器的類型不少,可是能夠分爲兩大類——比較過濾器,專用過濾器過濾器的做用是在服務端判斷數據是否知足條件,而後只將知足條件的數據返回給客戶端;如在進行訂單開發的時候,咱們使用rowkeyfilter過濾出某個用戶的全部訂單
答:宕機分爲 HMaster 宕機和 HRegisoner 宕機,若是是 HRegisoner 宕機, HMaster 會將其所管理的 region 從新分佈到其餘活動的 RegionServer 上,因爲數據和日誌都持久在 HDFS中,該操做不會致使數據丟失。因此數據的一致性和安全性是有保障的。若是是 HMaster 宕機, HMaster 沒有單點問題, HBase 中能夠啓動多個 HMaster,經過Zookeeper 的 Master Election 機制保證總有一個 Master 運行。即 ZooKeeper 會保證總會有一個 HMaster 在對外提供服務。
致使Hbase掛掉的場景HMasterHMaster會出現異常(執行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」。 HRegionServerHRegionServer會出現異常中止(執行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。