· Hbase是構建在hdfs上的分佈式列式存儲系統算法
· Hbase內部管理的文件所有存儲在HDFS上面,sql
· Hbase是基於google bigtable 模型開發的,典型的noSql-KeyValue數據庫;數據庫
· Hbase是hadoop生態系統中的重要一員,主要用於海量結構化數據的存儲;apache
· 從邏輯上講,Hbase將數據按照表,行和列進行存儲安全
· 與hadoop同樣,Hbase目標主要依靠橫向擴展,經過不斷的增長廉價的商服務器
用服務器來增長計算能力和存儲能力。架構
· 大:一個表能夠有數十億,上百萬列;併發
· 無模式:每行都有一個可排序的主鍵和任意多的列,列能夠根據需求動態的增長,同一張表中不一樣的行包括了不一樣的列app
· 面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索負載均衡
· 稀疏:空(null並不佔有存儲空間)表能夠設計的很是稀疏
· 數據多版本:每一個單元中的數據能夠有多個版本,默認狀況下,版本好自動
分配,是單元格插入的時間戳
· 數據類型單一:Hbase中的數據都是字符串.沒有其餘類型
· Hbase的邏輯視圖
· Hbase的基本概念
RowKey:是byte array 是表中每條記錄的主鍵,方便快速查找,rowkey的設計很是重要。
Columns Family:列族,擁有一個名稱String,包含一個或多個相關列
Column :屬於某一個ColumnsFamily familyName:columnname 每條記錄動態添加
VersionNumber :類型爲long ,默認值是系統時間戳,可由用戶自定義
Value(cell)byte array
· Hbase的物理模型
每一個colums family存儲在HDFS上的一個單獨文件中,空值不被保存
Key和version number 在每一個column family 中均有一份
Hbase爲每一個值維護了多級索引
即<key,column family,column name ,timastamp>
· Hbase的物理存儲
Table中全部的行都按照rowkey的字典順序排序
Table 在行的方向上被分爲多個Region
Region 按大小分割的.每一個表開始只有一個Region 隨着數據的增多,Region不斷增大,當增大到一個閥值的時候,Region就會等分紅兩個新的Region,以後會愈來愈多的Region
Region是Hbase中分佈式存儲和負載均衡的最小單元,不一樣Region被分配到不一樣的RegionServer上。
Region雖然是分佈式存儲的最小單元,但並非存儲的最小單元。Region由多個Store組成,每一個store保存着一個columns family ;每一個Store又由一個memStore和多個0個或多個StoreFile組成,StoreFile 包含HFile; memStore存儲在內存中,StoreFile存儲在HDFS上
· Hbase的架構及基本組件
基本組件說明
包含訪問Hbase的接口,並維護cache來加快hbase的訪問 好比Region的位置信息
爲RegionServer 分配Region
負責RegionServer的負載均衡
發現失效的RegionServer並從新分配其上的Region
管理用戶對table的增刪改查
RegionServer 維護Region 處理對這些Region的IO請求
RegionServer 負責切分在運行過程當中變大的Region
經過選舉,保證任什麼時候候,集羣當中只有一個Master.Master與RegionServer啓動的時候會向Zookeeper註冊
存儲全部的Region的地址
實時監控RegionServer的上線和下線的信息。並適時通知給Master
存儲着Hbase的schema和table元數據
默認狀況下,Hbase管理Zookeeper實例,好比,啓動或者中止Zookeeper
Zookeeper 的引入使得Master再也不是單點故障
Hbase的容錯與恢復機制
從架構中咱們能夠發現,每個RegionServer中有一個HLog文件, 在每次用戶操做寫入MemStore的同時,也會先向Hlog中寫一份,Hlog文件會按期更新,並刪除舊的文件(已經持久化到StoreFile中的數據)。當RegionServer宕機之後,Master會經過Zookeeper感知到,Master首先會處理遺留的Hlog文件,將其不一樣的Region的log數據進行拆分,分別放到相應的Region目錄上,而後再將失效的Region從新分配到其餘RegionServers上,RegionServer在load Region過程當中,會發現有歷史Hlog須要處理,所以會replay Hlog中的數據到MemStore中而後flush進StoreFile中 完成數據的恢復
Hbase的容錯性
Hbase的讀寫都要先通過先肯定RegionServer的地址
過程大概以下:客戶端先向ZK請求目標數據的地址
ZK保存了-ROOT-表的location,客戶端根據location找到.META.表 其中包含了全部的用戶空間Region列表,以及RegionSever地址,根據請求參數去表中查找,而後獲得一個regionInfo列的數據 RegionServer
客戶端根據RegionServer地址而後開始進行數據讀和寫
讀:客戶端發出讀請求,客戶端根據用戶提供的表名,行鍵去客戶端裏的緩衝區進行查找,若是沒有,就去Zookeeper進行查詢,經過上面過程找到RegionServer地址和regioninfo信息,而後與RegionServer創建鏈接,將regioninfo列的數據提交給Regionserver
RegionServer接收到客戶端的請求,而後建立一個RegionScanner對象,經過該對象定位到Region,而後Region建立StoreScanner,經過StoreScanner對定位到Store,Store建立一個MemStoreScanner對象,這個對象負責去MemStore中有沒有數據,有就返回,沒有就建立多個StoreFIleScanner對象,每一個對象,負責去不一樣的HFile中查詢數據。若是找到返回,找不到返回null
寫:客戶端發出寫的請求,
當客戶端進行put操做時,數據會自動保存到HRegion上,在HRegionServer中,找到對應要寫入的HRegion以後,數據會寫入到HLog中並同時寫入到HStore的MemStore內存中,會在內存中按照行鍵對數據進行排序,當內存中的數據達到必定閾值後,會觸發flush操做。Flush操做主要就是把MemStore內存中的數據寫入到StoreFile中,當HDFS中的StoreFile個數達到必定的閾值後,會觸發compact(合併)操做,將HDFS中全部的StoreFile合併成一個新的SotreFile,在合併的時候會按照行鍵進行排序,而且會進行版本合併和數據刪除。當StoreFile經過不斷的合併操做後,StoreFile文件會變得愈來愈大,當這個StoreFile達到必定的閾值後,會觸發Split(切分)操做,同時把當前region拆分紅兩個新的region,原有的region會下線,新的兩個region會被HMaster分配到相應的HRegionServer上,使得原來一個Region的壓力得以分流到兩個Region上,其實,HBase只是增長數據,更新和刪除操做都是compact階段作的,因此,客戶端寫入成功的標誌是HLog和MemStore中都有數據。
先寫HLog,可是若是顯示MemSotre也是沒問題的,由於MemStore的MVCC(多版本併發控制)不會向前滾動,這些變化在更新MVCC以前,Scan是沒法看到的,因此在寫入HLog以前,即便MemStore有數據,客戶端也查詢不到。
1.RowKey的設計
Hbase是經過RowKey進行檢索的,系統經過找到某個RowKey(或者某個RowKey範圍)所在的Region。而後將查詢數據的請求由該Region獲取數據 Hbase支持3中檢索方式
A)經過單個Rowkey訪問,按照某個RowKey鍵值進行get操做獲取惟一一條記錄
B)經過RowKey的range進行scan即經過設置startRowkey和endRowKey,能夠按指定的條件獲取一批記錄
C)全表掃描,即直接掃描整張表中全部行的數
設計原則:
·長度原則:不要超過16個字節
緣由:若是rowKey長度過長,會極大影響HFile的存儲效率
Memstore將緩衝的部分數據加載到內存,若是rowKey過長,內存的有效利用率會下降,從而下降檢索效率
·惟一原則:保證惟一性
·散列原則:項目中的設計,由於咱們的查找數據的時候,是按照時間戳進行查找的,因此時間戳應該是rowkey的一部分,把rowkey的低位放時間字段,
高位是用CRC32算法將eventName+uuid+memberid壓縮保證惟一性
整合的原理:
Hive和hbase的整合的實現是利用二者自己對外的API接口互相進行通訊,主要是依靠hive/lib下的hive-hbase-handler-0.9.0.jar 他負責通訊
整合的好處:
Hive方便的提供了Hql類sql語句接口來簡化mapreduce的使用,而Hbase提供了低延遲的數據庫訪問。二者相結合就能夠用mapreduce來對hbase中的數據進行離線的計算和分析
缺點:性能的損失
1.建立一個指向Hbase的hive表
create external table event_logs(
row string,
pl string,
en string,
s_time string,
p_url string,
u_ud string,
u_sd string)
row format serde 'org.apache.hadoop.hive.hbase.HBaseSerDe'
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
With serdeproperties('hbase.columns.mapping'=':key,info:pl,info:en,info:s_time,info:p_url,
info:u_ud,info:u_sd')
tblproperties('hbase.table.name'='event_logs');
**** 爲了數據的安全,將表建立成外部表,防止刪除表的時候將hbase表中的數據刪除
2.添加數據的時候只能用insert....select....
3.兩端的數據是同步的
4.Hive多列和hbase的多列出了行鍵和hive第一個字段不對應外,一一對應
5.Hive就是讀取hbase的數據