1、數據庫
一、什麼是Hbase。apache
是一個高可靠性、高性能、列存儲、可伸縮、實時讀寫的分佈式數據庫系統。編程
適合於存儲非結構化數據,基於列的而不是基於行的模式瀏覽器
如圖:Hadoop生態中HBase與其餘部分的關係。緩存
二、關係數據庫已經流行不少年,而且Hadoop已經有了HDFS和MapReduce,爲何須要HBase?安全
Hadoop能夠很好地解決大規模數據的離線批量處理問題,可是,受限於HadoopMapReduce編程框架的高延遲數據處理機制,使得Hadoop沒法知足大規模數據實時處理應用的需求服務器
HDFS面向批量訪問模式,不是隨機訪問模式數據結構
傳統的通用關係型數據庫沒法應對在數據規模劇增時致使的系統擴展性和性能問題(分庫分表也不能很好解決)架構
傳統關係數據庫在數據結構變化時通常須要停機維護;空列浪費存儲空間併發
所以,業界出現了一類面向半結構化數據存儲和處理的高可擴展、低寫入/查詢延遲的系統,例如,鍵值數據庫、文檔數據庫和列族數據庫(如BigTable和HBase等)
HBase已經成功應用於互聯網服務領域和傳統行業的衆多在線式數據分析處理系統中
三、HBase與傳統的關係數據庫的區別
(1)數據類型:關係數據庫採用關係模型,具備豐富的數據類型和存儲方式,HBase則採用了更加簡單的數據模型,它把數據存儲爲未經解釋的字符串
(2)數據操做:關係數據庫中包含了豐富的操做,其中會涉及複雜的多表鏈接。HBase操做則不存在複雜的表與表之間的關係,只有簡單的插入、查詢、刪除、清空等,由於HBase在設計上就避免了複雜的表和表之間的關係
(3)存儲模式:關係數據庫是基於行模式存儲的。HBase是基於列存儲的,每一個列族都由幾個文件保存,不一樣列族的文件是分離的
(4)數據索引:關係數據庫一般能夠針對不一樣列構建複雜的多個索引,以提升數據訪問性能。HBase只有一個索引——行鍵,經過巧妙的設計,HBase中的全部訪問方法,或者經過行鍵訪問,或者經過行鍵掃描,從而使得整個系統不會慢下來
(5)數據維護:在關係數據庫中,更新操做會用最新的當前值去替換記錄中原來的舊值,舊值被覆蓋後就不會存在。而在HBase中執行更新操做時,並不會刪除數據舊的版本,而是生成一個新的版本,舊有的版本仍然保留
(6)可伸縮性:關係數據庫很難實現橫向擴展,縱向擴展的空間也比較有限。相反,HBase和BigTable這些分佈式數據庫就是爲了實現靈活的水平擴展而開發的,可以輕易地經過在集羣中增長或者減小硬件數量來實現性能的伸縮
2、Hbase數據模型
一、模型概述
HBase是一個稀疏、多維度、排序的映射表,這張表的索引是行鍵、列族、列限定符和時間戳
每一個值是一個未經解釋的字符串,沒有數據類型
用戶在表中存儲數據,每一行都有一個可排序的行鍵和任意多的列
表在水平方向由一個或者多個列族組成,一個列族中能夠包含任意多個列,同一個列族裏面的數據存儲在一塊兒
列族支持動態擴展,能夠很輕鬆地添加一個列族或列,無需預先定義列的數量以及類型,全部列均以字符串形式存儲,用戶須要自行進行數據類型轉換
HBase中執行更新操做時,並不會刪除數據舊的版本,而是生成一個新的版本,舊有的版本仍然保留(這是和HDFS只容許追加不容許修改的特性相關的)
二、數據座標
HBase中須要根據行鍵、列族、列限定符和時間戳來肯定一個單元格,所以,能夠視爲一個「四維座標」,即[行鍵,列族, 列限定符,時間戳]
鍵 |
值 |
[「201505003」,「Info」,「email」, 1174184619081] |
「xie@qq.com」 |
[「201505003」,「Info」,「email」, 1174184620720] |
「you@163.com」
|
三、概念視圖
四、物理視圖
3、HBase實現原理
一、HBase的實現包括三個主要的功能組件:
(1)庫函數:連接到每一個客戶端
(2)一個Master主服務器
(3)許多個Region服務器
主服務器Master負責管理和維護HBase表的分區信息,維護Region服務器列表,分配Region,負載均衡
Region服務器負責存儲和維護分配給本身的Region,處理來自客戶端的讀寫請求
客戶端並非直接從Master主服務器上讀取數據,而是在得到Region的存儲位置信息後,直接從Region服務器上讀取數據
客戶端並不依賴Master,而是經過Zookeeper來得到Region位置信息,大多數客戶端甚至歷來不和Master通訊,這種設計方式使得Master負載很小
二、Region
開始只有一個Region,後來不斷分裂
Region拆分操做很是快,接近瞬間,由於拆分以後的Region讀取的仍然是原存儲文件,直到「合併」過程把存儲文件異步地寫到獨立的文件以後,纔會讀取新文件
同一個Region不會被分拆到多個Region服務器
每一個Region服務器存儲10-1000個Region
元數據表,又名.META.表,存儲了Region和Region服務器的映射關係
當HBase表很大時, .META.表也會被分裂成多個Region
根數據表,又名-ROOT-表,記錄全部元數據的具體位置
-ROOT-表只有惟一一個Region,名字是在程序中被寫死的
Zookeeper文件記錄了-ROOT-表的位置
客戶端訪問數據時的「三級尋址」
爲了加速尋址,客戶端會緩存位置信息,同時,須要解決緩存失效問題
尋址過程客戶端只須要詢問Zookeeper服務器,不須要鏈接Master服務器
三、HBase的三層結構中各層次的名稱和做用
層次 |
名稱 |
做用 |
第一層 |
Zookeper文件 |
記錄了-ROOT-表的位置信息 |
第二層 |
-ROOT-表 |
記錄了.META.表的Region位置信息 -ROOT-表只能有一個Region。經過-ROOT-表,就能夠訪問.META.表中的數據 |
第三層 |
.META.表 |
記錄了用戶數據表的Region位置信息,.META.表能夠有多個Region,保存了HBase中全部用戶數據表的Region位置信息 |
4、HBase運行機制
一、HBase系統架構
(一、客戶端包含訪問HBase的接口,同時在緩存中維護着已經訪問過的Region位置信息,用來加快後續數據訪問過程
(二、Zookeeper能夠幫助選舉出一個Master做爲集羣的總管,並保證在任什麼時候刻總有惟一一個Master在運行,這就避免了Master的「單點失效」問題
(Zookeeper是一個很好的集羣管理工具,被大量用於分佈式計算,提供配置維護、域名服務、分佈式同步、組服務等。)
(3. Master
主服務器Master主要負責表和Region的管理工做:
管理用戶對錶的增長、刪除、修改、查詢等操做
實現不一樣Region服務器之間的負載均衡
在Region分裂或合併後,負責從新調整Region的分佈
對發生故障失效的Region服務器上的Region進行遷移
(4. Region服務器
Region服務器是HBase中最核心的模塊,負責維護分配給本身的Region,並響應用戶的讀寫請求
二、Region
(一、用戶讀寫數據過程
用戶寫入數據時,被分配到相應Region服務器去執行
用戶數據首先被寫入到MemStore和Hlog中
只有當操做寫入Hlog以後,commit()調用纔會將其返回給客戶端
當用戶讀取數據時,Region服務器會首先訪問MemStore緩存,若是找不到,再去磁盤上面的StoreFile中尋找
(二、緩存的刷新
系統會週期性地把MemStore緩存裏的內容刷寫到磁盤的StoreFile文件中,清空緩存,並在Hlog裏面寫入一個標記、
每次刷寫都生成一個新的StoreFile文件,所以,每一個Store包含多個StoreFile文件
每一個Region服務器都有一個本身的HLog文件,每次啓動都檢查該文件,確認最近一次執行緩存刷新操做以後是否發生新的寫入操做;若是發現更新,則先寫入MemStore,再刷寫到StoreFile,最後刪除舊的Hlog文件,開始爲用戶提供服務
(三、StroreFile的合併
每次刷寫都生成一個新的StoreFile,數量太多,影響查找速度
調用Store.compact()把多個合併成一個
合併操做比較耗費資源,只有數量達到一個閾值才啓動合併
三、Store工做原理
Store是Region服務器的核心
多個StoreFile合併成一個
觸發分裂操做,1個父Region被分裂成兩個子Region
單個StoreFile過大時,又
四、HLog工做原理
分佈式環境必需要考慮系統出錯。HBase採用HLog保證系統恢復
HBase系統爲每一個Region服務器配置了一個HLog文件,它是一種預寫式日誌(WriteAhead Log)
用戶更新數據必須首先寫入日誌後,才能寫入MemStore緩存,而且,直到MemStore緩存內容對應的日誌已經寫入磁盤,該緩存內容才能被刷寫到磁盤
Zookeeper會實時監測每一個Region服務器的狀態,當某個Region服務器發生故障時,Zookeeper會通知Master
Master首先會處理該故障Region服務器上面遺留的HLog文件,這個遺留的HLog文件中包含了來自多個Region對象的日誌記錄
系統會根據每條日誌記錄所屬的Region對象對HLog數據進行拆分,分別放到相應Region對象的目錄下,而後,再將失效的Region從新分配到可用的Region服務器中,並把與該Region對象相關的HLog日誌記錄也發送給相應的Region服務器
Region服務器領取到分配給本身的Region對象以及與之相關的HLog日誌記錄之後,會從新作一遍日誌記錄中的各類操做,把日誌記錄中的數據寫入到MemStore緩存中,而後,刷新到磁盤的StoreFile文件中,完成數據恢復
共用日誌優勢:提升對錶的寫操做性能;缺點:恢復時須要分拆日誌
5、HBase性能
一、行鍵(RowKey)
行鍵是按照字典序存儲,所以,設計行鍵時,要充分利用這個排序特色,將常常一塊兒讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。
舉個例子:若是最近寫入HBase表中的數據是最可能被訪問的,能夠考慮將時間戳做爲行鍵的一部分,因爲是字典序排序,因此可使用Long.MAX_VALUE- timestamp做爲行鍵,這樣能保證新寫入的數據在讀取時能夠被快速命中。
InMemory:建立表的時候,能夠經過HColumnDescriptor.setInMemory(true)將表放到Region服務器的緩存中,保證在讀取的時候被cache命中。
Max Version:建立表的時候,能夠經過HColumnDescriptor.setMaxVersions(int maxVersions)設置表中數據的最大版本,若是隻須要保存最新版本的數據,那麼能夠設置setMaxVersions(1)。
Time To Live建立表的時候,能夠經過HColumnDescriptor.setTimeToLive(inttimeToLive)設置表中數據的存儲生命期,過時數據將自動被刪除,例如若是隻須要存儲最近兩天的數據,那麼能夠設置setTimeToLive(2* 24 * 60 * 60)。
二、HBaseMaster默認基於Web的UI服務端口爲60010,HBase region服務器默認基於Web的UI服務端口爲60030.若是master運行在名爲master.foo.com的主機中,mater的主頁地址就是http://master.foo.com:60010,用戶能夠經過Web瀏覽器輸入這個地址查看該頁面
能夠查看HBase集羣的當前狀態
三、NoSQL區別於關係型數據庫的一點就是NoSQL不使用SQL做爲查詢語言,至於爲什麼在NoSQL數據存儲HBase上提供SQL接口
易使用,減小編碼
四、HBase只有一個針對行健的索引
訪問HBase表中的行,只有三種方式:
經過單個行健訪問
經過一個行健的區間來訪問
全表掃描
總結:
一、HBase數據庫是BigTable的開源實現,和BigTable同樣,支持大規模海量數據,分佈式併發數據處理效率極高,易於擴展且支持動態伸縮,適用於廉價設備
二、HBase能夠支持NativeJava API、HBaseShell、ThriftGateway、Hive等多種訪問接口,能夠根據具體應用場合選擇相應訪問方式
三、HBase實際上就是一個稀疏、多維、持久化存儲的映射表,它採用行鍵、列鍵和時間戳進行索引,每一個值都是未經解釋的字符串。
四、HBase採用分區存儲,一個大的表會被分拆許多個Region,這些Region會被分發到不一樣的服務器上實現分佈式存儲
五、HBase的系統架構包括客戶端、Zookeeper服務器、Master主服務器、Region服務器。客戶端包含訪問HBase的接口;Zookeeper服務器負責提供穩定可靠的協同服務;Master主服務器主要負責表和Region的管理工做;Region服務器負責維護分配給本身的Region,並響應用戶的讀寫請求
在HBase中,namespace命名空間指對一組表的邏輯分組,相似RDBMS中的database,方便對錶在業務上劃分。Apache HBase從0.98.0, 0.95.2兩個版本開始支持namespace級別的受權操做,HBase全局管理員能夠建立、修改和回收namespace的受權。
HBase系統默認定義了兩個缺省的namespace
建立namespace
hbase>create_namespace 'ai_ns'
刪除namespace
hbase>drop_namespace 'ai_ns'
查看namespace
hbase>describe_namespace 'ai_ns'
列出全部namespace
hbase>list_namespace
在namespace下建立表
hbase>create 'ai_ns:testtable', 'fm1'
查看namespace下的表
hbase>list_namespace_tables 'ai_ns'
具有Create權限的namespace Admin能夠對錶建立和刪除、生成和恢復快照
具有Admin權限的namespace Admin能夠對錶splits或major compactions
受權tenant-A用戶對ai_ns下的寫權限
hbase>grant 'tenant-A' 'W' '@ai_ns'
回收tenant-A用戶對ai_ns的全部權限
hbase>revoke 'tenant-A''@ai_ns'
當前用戶:hbase
hbase>namespace_create 'hbase_perf'
hbase>grant 'mike', 'W', '@hbase_perf'
當前用戶:mike
hbase>create 'hbase_perf.table20', 'family1'
hbase>create 'hbase_perf.table50', 'family1'
mike建立了兩張表table20和table50,同時成爲這兩張表的owner,意味着有'RWXCA'權限
此時,mike團隊的另外一名成員alice也須要得到hbase_perf下的權限,hbase管理員操做以下
當前用戶:hbase
hbase>grant 'alice', 'W', '@hbase_perf'
此時alice能夠在hbase_perf下建立表,可是沒法讀、寫、修改和刪除hbase_perf下已存在的表
當前用戶:alice
hbase>scan 'hbase_perf:table20'
報錯AccessDeniedException
若是但願alice能夠訪問已經存在的表,則hbase管理員操做以下
當前用戶:hbase
hbase>grant 'alice', 'RW', 'hbase_perf.table20'
hbase>grant 'alice', 'RW', 'hbase_perf.table50'
在HBase中啓用受權機制
hbase-site.xml
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
配置完成後須要重啓HBase集羣
受權相關JIRA
HBase namespace特性是對錶資源進行隔離的一種技術,隔離技術決定了HBase可否實現資源統一化管理的關鍵,提升了總體的安全性。
https://blog.csdn.net/maosijunzi/article/details/78481870?locationNum=9&fps=1