HBASE是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,利用HBASE技術可在廉價PC Server上搭建起大規模結構化存儲集羣。html
HBASE的目標是存儲並處理大型的數據,更具體來講是僅需使用普通的硬件配置,就可以處理由成千上萬的行和列所組成的大型數據。sql
HBASE是Google Bigtable的開源實現,可是也有不少不一樣之處。好比:Google Bigtable使用GFS做爲其文件存儲系統,HBASE利用Hadoop HDFS做爲其文件存儲系統;Google運行MAPREDUCE來處理Bigtable中的海量數據,HBASE一樣利用Hadoop MapReduce來處理HBASE中的海量數據;Google Bigtable利用Chubby做爲協同服務,HBASE利用Zookeeper做爲協同服務。shell
一、傳統數據庫遇到的問題:數據庫
1)數據量很大的時候沒法存儲;
2)沒有很好的備份機制;
3)數據達到必定數量開始緩慢,很大的話基本沒法支撐;數組
二、HBASE優點:緩存
1)線性擴展,隨着數據量增多能夠經過節點擴展進行支撐;
2)數據存儲在hdfs上,備份機制健全;
3)經過zookeeper協調查找數據,訪問速度快。安全
一、一個或者多個主節點,Hmaster;服務器
二、多個從節點,HregionServer;網絡
三、HBase依賴項,zookeeper;架構
HBase是一個面向列的數據庫,在表中它由行排序。表模式定義只能列族,也就是鍵值對。一個表有多個列族以及每個列族能夠有任意數量的列。後續列的值連續存儲在磁盤上。表中的每一個單元格值都具備時間戳。總之,在一個HBase:
這裏的列式存儲或者說面向列,其實說的是列族存儲,HBase是根據列族來存儲數據的。列族下面能夠有很是多的列,列族在建立表的時候就必須指定。
RDBMS的表:
HBase的表:
與nosql數據庫同樣,row key是用來表示惟一一行記錄的主鍵,HBase的數據時按照RowKey的字典順序進行全局排序的,全部的查詢都只能依賴於這一個排序維度。訪問HBASE table中的行,只有三種方式:
1. 經過單個row key訪問;
2. 經過row key的range(正則)
3. 全表掃描
Row key 行鍵(Row key)能夠是任意字符串(最大長度是64KB,實際應用中長度通常爲10-1000bytes),在HBASE內部,row key保存爲字節數組。存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將常常一塊兒讀取的行存儲放到一塊兒。(位置相關性)
列簇:HBASE表中的每一個列,都歸屬於某個列族。列族是表的schema的一部分(而列不是),必須在使用表以前定義。列名都以列族做爲前綴。例如courses:history,courses:math 都屬於courses這個列族。
由{row key,columnFamily,version} 惟一肯定的單元。cell中的數據是沒有類型的,所有是字節碼形式存儲。
關鍵字:無類型、字節碼
HBASE中經過rowkey和columns肯定的爲一個存儲單元稱爲cell。每一個cell都保存着同一份數據的多個版本。版本經過時間戳來索引。時間戳的類型是64位整型。時間戳能夠由HBASE(在數據寫入時自動)賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也能夠由客戶顯示賦值。若是應用程序要避免數據版本衝突,就必須本身生成具備惟一性的時間戳。每一個cell中,不一樣版本的數據按照時間倒序排序,即最新的數據排在最前面。
爲了不數據存在過多版本形成的管理(包括存儲和索引)負擔,HBASE提供了兩種數據版本回收方式。一是保存數據的最後n個版本,而是保存最近一段時間內的版本(好比最近7天)。用戶能夠針對每一個列族進行設置。
組成部件說明:
Client:
使用HBase RPC機制與HMaster和HRegionServer進行通訊
Client與HMaster進行管理類操做
Client與HRegionServer進行數據讀寫類操做
Zookeeper:
Zookeeper Quorum存儲-ROOT-表地址、HMaster地址
HRegionServer把本身以Ephedral方式註冊到Zookeeper中,HMaster隨時感知各個HRegionServer的健康情況
Zookeeper避免HMaster單點問題
Zookeeper的主要做用:客戶端首先聯繫ZooKeeper子集羣(quorum)(一個由ZooKeeper節點組成的單獨集羣)查找行健。上述過程是經過ZooKeeper獲取含有-ROOT-的region服務器名(主機名)來完成的。經過含有-ROOT-的region服務器能夠查詢到含有.META.表中對應的region服務器名,其中包含請求的行健信息。這兩處的主要內容都被緩存下來了,而且都只查詢一次。最終,經過查詢.META服務器來獲取客戶端查詢的行健數據所在region的服務器名。一旦知道了數據的實際位置,即region的位置,HBase會緩存此次查詢的信息,同時直接聯繫管理實際數據的HRegionServer。因此,以後客戶端能夠經過緩存信息很好地定位所需的數據位置,而不用再次查找.META.表。
HMaster:
HMaster沒有單點問題,HBase能夠啓動多個HMaster,經過Zookeeper的Master Election機制保證總有一個Master在運行
主要負責Table和Region的管理工做:
1. 管理用戶對錶的增刪改查操做
2. 管理HRegionServer的負載均衡,調整Region分佈
3. Region Split後,負責新Region的分佈
4. 在HRegionServer停機後,負責失效HRegionServer上Region遷移
HRegionServer:
HBase中最核心的模塊,主要負責響應用戶I/O請求,向HDFS文件系統中讀寫
HRegionServer管理一系列HRegion對象;
每一個HRegion對應Table中一個Region,HRegion由多個HStore組成;
每一個HStore對應Table中一個Column Family的存儲;
Column Family就是一個集中的存儲單元,故將具備相同IO特性的Column放在一個Column Family會更高效。
能夠看到,client訪問hbase上的數據並不須要master參與(尋址訪問zookeeper和region server,數據讀寫訪問region server),master僅僅維護table和region的元數據信息(table的元數據信息保存在zookeeper上),負載很低。HRegionServer存取一個子表時,會建立一個HRegion對象,而後對錶的每一個列族建立一個Store實例,每一個Store都會有一個MemStore和0個或多個StoreFile與之對應,每一個StoreFile都會對應一個HFile,HFile就是實際的存儲文件。所以,一個HRegion(表)有多少個列族就有多少個Store。一個HRegionServer會有多個HRegion和一個HLog。
HRegion:
table在行的方向上分隔爲多個Region。Region是HBase中分佈式存儲和負載均衡的最小單元,即不一樣的region能夠分別在不一樣的Region Server上,但同一個Region是不會拆分到多個server上。
Region按大小分隔,每一個表通常是隻有一個region。隨着數據不斷插入表,region不斷增大,當region的某個列族達到一個閥值(默認256M)時就會分紅兩個新的region。
每一個region由如下信息標識:
HRegion定位:Region被分配給哪一個RegionServer是徹底動態的,因此須要機制來定位Region具體在哪一個region server。
HBase使用三層結構來定位region:
注意:
-ROOT-表永遠不會被分隔爲多個region,保證了最多須要三次跳轉,就能定位到任意的region。client會將查詢的位置信息緩存起來,緩存不會主動失效,所以若是client上的緩存所有失效,則須要進行6次網絡來回,才能定位到正確的region,其中三次用來發現緩存失效,另外三次用來獲取位置信息。
table和region的關係
table默認最初只有一個region,隨着記錄數的不斷增長而變大,起初的region會逐漸分裂成多個region,一個region有【startKey, endKey】表示,不一樣的region會被master分配給相應的regionserver管理。
region是hbase分佈式存儲和負載均衡的最小單元,不一樣的region分不到不一樣的regionServer。
注意:region雖然是分佈式存儲的最小單元,但並非存儲的最小單元。region是由一個或者多個store組成的,每一個store就是一個column family。每一個store又由memStore和1至多個store file 組成(memstore到一個閥值會刷新,寫入到storefile,有hlog來保證數據的安全性,一個regionServer有且只有一個hlog)
HStore:
HBase存儲的核心。由MemStore和StoreFile組成。MemStore是Stored Memory Buffer。
HLog:
引入HLog緣由:在分佈式系統環境中,沒法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的內存數據就會丟失,引入HLog就是防止這種狀況。
工做機制:
每一個HRegionServer中都會有一個HLog對象,HLog是一個實現Write Ahead Log的類,每次用戶操做寫入MemStore的同時,也會寫一份數據到HLog文件,HLog文件按期會滾動出新,並刪除舊的文件(已持久化到StoreFile中的數據)。當HRegionServer意外終止後,HMaster會經過Zookeeper感知,HMaster首先處理遺留的HLog文件,將不一樣region的log數據拆分,分別放到相應region目錄下,而後再將失效的region從新分配,領取到這些region的HRegionServer在Load Region的過程當中,會發現有歷史HLog須要處理,所以會Replay HLog中的數據到MemStore中,而後flush到StoreFiles,完成數據恢復。
HBase中的全部數據文件都存儲在Hadoop HDFS文件系統上,格式主要有兩種:
1. HFile,HBase中Key-Value數據的存儲格式,HFile是Hadoop的二進制格式文件,實際上StoreFile就是對HFile作了輕量級包裝,即StoreFile底層就是HFile。
2. HLog File,HBase中WAL(Write Ahead Log)的存儲格式,物理上是Hadoop的Sequence File
圖片解釋:
HFile文件不定長,長度固定的塊只有兩個:Trailer和FileInfo
Trailer中指針指向其餘數據塊的起始點
File Info中記錄了文件的一些Meta信息,例如:AVG_KEY_LEN, AVG_VALUE_LEN, LAST_KEY, COMPARATOR, MAX_SEQ_ID_KEY等
Data Index和Meta Index塊記錄了每一個Data塊和Meta塊的起始點
Data Block是HBase I/O的基本單元,爲了提升效率,HRegionServer中有基於LRU的Block Cache機制
每一個Data塊的大小能夠在建立一個Table的時候經過參數指定,大號的Block有利於順序Scan,小號Block利於隨機查詢
每一個Data塊除了開頭的Magic之外就是一個個KeyValue對拼接而成, Magic內容就是一些隨機數字,目的是防止數據損壞
HFile裏面的每一個KeyValue對就是一個簡單的byte數組。這個byte數組裏麪包含了不少項,而且有固定的結構。
KeyLength和ValueLength:兩個固定的長度,分別表明Key和Value的長度
Key部分:Row Length是固定長度的數值,表示RowKey的長度,Row 就是RowKey
Column Family Length是固定長度的數值,表示Family的長度
接着就是Column Family,再接着是Qualifier,而後是兩個固定長度的數值,表示Time Stamp和Key Type(Put/Delete)
Value部分沒有這麼複雜的結構,就是純粹的二進制數據
HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,除了table和region名字外,同時還包括 sequence number和timestamp,timestamp是「寫入時間」,sequence number的起始值爲0,或者是最近一次存入文件系統中sequence number。
HLog Sequece File的Value是HBase的KeyValue對象,即對應HFile中的KeyValue
1) Client經過Zookeeper的調度,向RegionServer發出寫數據請求,在Region中寫數據;
2) 數據被寫入Region的MemStore,知道MemStore達到預設閥值(即MemStore滿);
3) MemStore中的數據被Flush成一個StoreFile;
4) 隨着StoreFile文件的不斷增多,當其數量增加到必定閥值後,觸發Compact合併操做,將多個StoreFile合併成一個StoreFile,同時進行版本合併和數據刪除;
5) StoreFiles經過不斷的Compact合併操做,逐步造成愈來愈大的StoreFile;
6) 單個StoreFile大小超過必定閥值後,觸發Split操做,把當前Region Split成2個新的Region。父Region會下線,新Split出的2個子Region會被HMaster分配到相應的RegionServer上,使得原先1個Region的壓力得以分流到2個Region上。
能夠看出HBase只有增添數據,全部的更新和刪除操做都是在後續的Compact歷程中舉行的,使得用戶的寫操做只要進入內存就能夠馬上返回,實現了HBase I/O的高性能。
1) Client訪問Zookeeper,查找-ROOT-表,獲取.META.表信息;
2) 從.META.表查找,獲取存放目標數據的Region信息,從而找到對應的RegionServer;
3) 經過RegionServer獲取須要查找的數據;
4) RegionServer的內存分爲MemStore和BlockCache兩部分,MemStore主要用於寫數據,BlockCache主要用於讀數據。讀請求先到MemStore中查數據,查不到就到BlockCache中查,再查不到就會到StoreFile上讀,並把讀的結果放入BlockCache。
尋址過程:client—>Zookeeper—>ROOT表—>.META. 表—>RegionServer—>Region—>client
一、hbase提供了一個shell的終端給用戶交互
hbase shell
二、若是退出執行quit命令
名稱 | 命令表達式 |
查看hbase狀態 | status |
建立表 | create '表名','列族名1','列族名2','列族名N' |
查看全部表 | list |
描述表 | describe '表名' |
判斷表存在 | exists '表名' |
判斷是否禁用啓用表 | is_enabled '表名' |
添加記錄 | put '表名','rowkey','列族:列','值' |
查看記錄rowkey下的全部數據 | get '表名','rowkey' |
查看全部記錄 | scan '表名' |
查看錶中的記錄總數 | count '表名' |
獲取某個列族 | get '表名','rowkey','列族:列' |
獲取某個列族的某個列 | get '表名','rowkey','列族:列' |
刪除記錄 | delete '表名','行名','列族:列' |
刪除整行 | deleteall '表名','rowkey' |
刪除一張表 | 先要屏蔽該表,才能對該表進行刪除 |
清空表 | truncate '表名' |
查看某個表某個列中全部數據 | scan '表名',{COLUMNS=>'列族名:列名'} |
更新記錄 | 就是從新一遍,進行覆蓋,hbase沒有修改,都是追加 |
具體實例:
一、查看HBase運行狀態 status
二、建立表 create <table>,{NAME => <family>, VERSIONS => <VERSIONS>}
建立一個User表,而且有一個info列族
三、查看全部表 list
四、描述表詳情 describe 'User'
五、判斷表是否存在 exists 'User'
六、啓用或禁用表 is_disabled 'User' is_enabled 'User'
七、添加記錄,即插入數據,語法:put <table>,<rowkey>,<family:column>,<value>
八、根據rowKey查詢某個記錄,語法:get <table>,<rowkey>,[<family:column>, ...]
九、查詢全部記錄,語法:scan <table>,{COLUMNS => [family:column, ...], LIMIT => num}
掃描全部記錄
掃描前2條
範圍查詢
另外,還能夠添加TIMERANGE和FILTER等高級功能,STARTROW、ENDROW必須大寫,不然報錯,查詢結果不包含等於ENDROW的結果集。
十、統計表記錄數,語法:count <table>, {INTERVAL => intervalNum,CACHE => cacheNum}
INTERVAL設置多少行顯示一次及對應的rowkey,默認1000;CACHE每次去取的緩存區大小,默認是10,調整該參數可提升查詢速度。
十一、刪除
刪除列
刪除整行
刪除表中全部數據
十二、禁用或啓用表
禁用表
啓用表
十二、刪除表
刪除前,必須先disable
參考資料:
https://www.cnblogs.com/cenyuhai/p/3708135.html
https://blog.csdn.net/liutong123987/article/details/79377327