您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關HBase 分布式數據庫的原理及搭建是怎樣的,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
HBase位于Hadoop生態系統的結構化存儲層,建立在HDFS之上的分布式、面向列的數據庫,并且使用Zookeeper作為協調服務。
HDFS****為HBase提供了高可靠的底層存儲支持,
MapReduce****為HBase提供了高性能的計算能力,
Zookeeper****則為HBase提供了穩定的服務和失效恢復機制。
雖然Hadoop是一個高容錯、高延時的分布式文件系統和高并發的批處理系統,但是它不適用于提供實時計算;HBase是可以提供實時計算的分布式數據庫,數據被保存在HDFS分布式文件系統上,由HDFS保證期高容錯性,但是再生產環境中,HBase是如何基于hadoop提供實時性呢?
HBase上的數據是以StoreFile(HFile)二進制流的形式存儲在HDFS上block塊兒中;但是HDFS并不知道的HBase用于存儲什么,它只把存儲文件認為是二進制文件,也就是說,HBase的存儲數據對于HDFS文件系統是透明的。
在下面的表格中,我們對HDFS與HBase進行比較:
HDFS | HBase |
---|---|
HDFS適于存儲大容量文件的分布式文件系統。 | HBase是建立在HDFS之上的數據庫。 |
HDFS不支持快速單獨記錄查找。 | HBase提供在較大的表快速查找 |
HDFS提供了高延遲批量處理;沒有批處理概念。 | HBase提供了數十億條記錄低延遲訪問單個行記錄(隨機存取)。 |
HDFS提供的數據只能順序訪問。 | HBase內部使用哈希表和提供隨機接入,并且其存儲索引,可將在HDFS文件中的數據進行快速查找。 |
rowkey | column family(userInfo) | column family(addressInfo) | timestamp | ||||||
---|---|---|---|---|---|---|---|---|---|
name | age | sex | password | country | province | city | |||
1 | zhengshuang | 29 | 0 | 123456 | PRC | 遼寧 | 沈陽 | 11@1.com | 154590701 |
2 | lixiaolu | 28 | 0 | 123456 | PRC | 上海 | 上海 | 22@2.com | 154590702 |
3 | luozhixiang | 31 | 1 | 123456 | PRC | 臺灣 | 臺北 | 33@3.com | 154590703 |
表(Table)
在HBase,數據存儲在表中,表名是一個字符串,表由行和列組成。與關系型數據庫不同,HBase是多維映射的。
行(Row)
HBase的行由行鍵或一個多個列組成。行鍵沒有數據類型,總是視為字節數組byte[]。行鍵類似于關系型數據庫中的主鍵索引,在整個HBase表中是唯一的,但是RDBMS不同的是,行鍵按照字母順序排序。例如,表中已經有三條行鍵為1000001,1000002,1000004的數據,當插入一條行鍵為1000003的數據時,該條數據不會排在最后,而是排在行鍵1000002,1000004的中間。因此,行鍵的設計非常重要,我們可以利用行鍵的特性將相關的數據排列在一起。例如,將網站的域名作為行鍵的前綴,則應該將域名進行反轉存儲(org.apache.www,org.apache.mail,org.apache.jira),這樣將所有的Apache域名將在表中的排列在一起,而不是分散排列。
列族(Column Family)
HBase列族由多個列組成,相當于將列進行分組。列的數量沒有限制,一個列族里可以有數百萬格列。表中的每一個行都有同樣的列族。**列族必須在表創建的時候指定,不能輕易修改,且數量不超過三個。**列族名的類型是字符串。
列限定符(Qualifier)
列限定符用于代表HBase表中的列的名稱,定位列族里的數據。格式如**family:qualifier 。**代表family 列族中的 qualifier 列。
單元格(Cell)
單元格通過行鍵、列族和限定符一起來定位。單元格包含值和時間戳。值沒有數據類型,總是視為 byte[];時間戳代表值得版本,類型為long。
由于HBase表示多維映射的,因此行列的排列與傳統的RDBMS不同。傳統的RDBMS數據庫對于不存在的值,必須存儲NULL,而在HBase中,不存在的值可以省略,且不占存儲空間。此外HBase在建表時指定表名和列族,不需要指定列,所有的列在后續添加數據的時候動態添加,而RDBMS指定好列以后,不可以修改或動態添加。
[daniel@hadoop103 software]$ tar -zxvf hbase-1.2.1-bin.tar.gz -C /opt/moudle/
[daniel@hadoop103 hbase-1.2.1]$ vim conf/hbase-env.sh export JAVA_HOME=/usr/java/jdk1.8.0_211-amd64 #指定使用外部的zk集群 export HBASE_MANAGES_ZK=FALSE
[daniel@hadoop103 hbase-1.2.1]$ vim conf/hbase-site.xml <configuration> <!-- 指定hbase在HDFS上存儲的路徑 --> <property> <name>hbase.rootdir</name> <value>hdfs://hadoop101:9000/hbase</value> </property> <!-- 指定hbase是分布式的 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 指定zk的地址,多個用“,”分割 --> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop101:2181,hadoop102:2181,hadoop103:2181</value> </property> <property> <name>hbase.master.info.port</name> <value>16010</value> </property> <!--指定true為分布式集群部署--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> </configuration>
[daniel@hadoop103 hbase-1.2.1]$ vim conf/regionservers hadoop104 hadoop105 [daniel@hadoop101 hbase-1.2.1]$ vim conf/backup-masters hadoop105
[daniel@hadoop103 hbase-1.2.1]$ scp -r /opt/moudle/hbase-1.2.1/ daniel@hadoop104:/opt/moudle/ [daniel@hadoop103 hbase-1.2.1]$ scp -r /opt/moudle/hbase-1.2.1/ daniel@hadoop105:/opt/moudle/
進入客戶端操作界面
[daniel@hadoop103 hbase-1.2.1]$ bin/hbase shell
創建user表, 包含base_info、extra_info兩個列族
hbase(main):001:0> create 'user', 'base_info', 'extra_info' 0 row(s) in 1.7180 seconds => Hbase::Table - user ## 另一種寫法 hbase(main):002:0> create 'user2', {NAME => 'base_info', VERSIONS => '3'},{NAME => 'extra_info'} 0 row(s) in 1.2440 seconds => Hbase::Table - user2
添加數據操作
hbase(main):001:0> put 'user', 'rk0001', 'base_info:name', 'zhangsan' 0 row(s) in 0.2610 seconds hbase(main):002:0> put 'user', 'rk0001', 'base_info:gender', 'female' 0 row(s) in 0.0280 seconds hbase(main):003:0> put 'user', 'rk0001', 'base_info:age', 20 0 row(s) in 0.0180 seconds hbase(main):004:0> put 'user', 'rk0001', 'extra_info:address', 'beijing' 0 row(s) in 0.0410 seconds
數據查詢
hbase(main):005:0> get 'user', 'rk0001' COLUMN CELL base_info:age timestamp=1612262295591, value=20 base_info:gender timestamp=1612262285794, value=female base_info:name timestamp=1612262272928, value=zhangsan extra_info:address timestamp=1612262304269, value=beijing 4 row(s) in 0.0840 seconds hbase(main):006:0> get 'user', 'rk0001', 'base_info' COLUMN CELL base_info:age timestamp=1612262295591, value=20 base_info:gender timestamp=1612262285794, value=female base_info:name timestamp=1612262272928, value=zhangsan 3 row(s) in 0.0240 seconds
查看rowkey下面的某個列族的信息
hbase(main):006:0> get 'user', 'rk0001', 'base_info' COLUMN CELL base_info:age timestamp=1612262295591, value=20 base_info:gender timestamp=1612262285794, value=female base_info:name timestamp=1612262272928, value=zhangsan 3 row(s) in 0.0240 seconds
獲取user表中row key為rk0001,base_info列族的name、age列標示符的信息
hbase(main):007:0> get 'user', 'rk0001', 'base_info:name', 'base_info:age' COLUMN CELL base_info:age timestamp=1612262295591, value=20 base_info:name timestamp=1612262272928, value=zhangsan 2 row(s) in 0.0200 seconds
獲取user表中row key為rk0001,base_info、extra_info列族的信息
hbase(main):008:0> get 'user', 'rk0001', 'base_info', 'extra_info' COLUMN CELL base_info:age timestamp=1612262295591, value=20 base_info:gender timestamp=1612262285794, value=female base_info:name timestamp=1612262272928, value=zhangsan extra_info:address timestamp=1612262304269, value=beijing 4 row(s) in 0.0180 seconds hbase(main):009:0> get 'user', 'rk0001', {COLUMN => ['base_info', 'extra_info']} COLUMN CELL base_info:age timestamp=1612262295591, value=20 base_info:gender timestamp=1612262285794, value=female base_info:name timestamp=1612262272928, value=zhangsan extra_info:address timestamp=1612262304269, value=beijing 4 row(s) in 0.0210 seconds hbase(main):010:0> get 'user', 'rk0001', {COLUMN => ['base_info:name', 'extra_info:address']} COLUMN CELL base_info:name timestamp=1612262272928, value=zhangsan extra_info:address timestamp=1612262304269, value=beijing 2 row(s) in 0.0200 seconds
指定rowkey與列值查詢
hbase(main):011:0> get 'user', 'rk0001', {FILTER => "ValueFilter(=, 'binary:zhangsan')"} COLUMN CELL base_info:name timestamp=1612262272928, value=zhangsan 1 row(s) in 0.0750 seconds
獲取user表中row key為rk0001,列標示符中含有a的信息
hbase(main):002:0> get 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"} COLUMN CELL base_info:age timestamp=1612262295591, value=20 base_info:name timestamp=1612262272928, value=zhangsan extra_info:address timestamp=1612262304269, value=beijing
繼續插入一批數據
hbase(main):003:0> put 'user', 'rk0002', 'base_info:name', 'fanbingbing' 0 row(s) in 0.1320 seconds hbase(main):004:0> put 'user', 'rk0002', 'base_info:gender', 'female' 0 row(s) in 0.0270 seconds hbase(main):005:0> put 'user', 'rk0002', 'base_info:birthday', '2000-06-06' 0 row(s) in 0.0160 seconds hbase(main):006:0> put 'user', 'rk0002', 'extra_info:address', 'shanghai' 0 row(s) in 0.0150 seconds
查詢user表中的所有信息
hbase(main):007:0> scan 'user'
列族查詢
## Scan時可以設置是否開啟Raw模式,開啟Raw模式會返回包括已添加刪除標記但是未實際刪除的數據 ## VERSIONS指定查詢的最大版本數
hbase(main):008:0> scan 'user', {COLUMNS => 'base_info'}
hbase(main):009:0> scan 'user', {COLUMNS => 'base_info', RAW => true, VERSIONS => 5}
多列族查詢
hbase(main):023:0> scan 'user', {COLUMNS => ['base_info', 'extra_info']}
hbase(main):024:0> scan 'user', {COLUMNS => ['base_info:name', 'extra_info:address']}
指定列族與某個列名查詢
HBase架構采用主從(master/slaver)方式,由三種類型的節點組成——**HMaster節點,HRegionServer節點 和 Zookeeper集群。**HMaster節點作為主節點,HRegionServer節點作為從節點,主從方式類似于HDFS的NameNode,和DataNode。
HBase客戶端通過 RPC方式 與 HMaste節點 和 HRegionServer節點 通信,HMaster節點連接Zookeeper獲得HRegionServer節點的狀態并對其進行管理。HBase的系統架構。
由于 HBase 將底層數據存儲于HDFS中,因此也設計 NameNode節點 和 DataNode節點等,HRegionServer經常與HDFS的DataNode在同一個節點,有利于數據的本地訪問,節省網絡傳輸時間。
HMaster 并非只有一個,用戶可以啟動多個 HMaster 節點,并通過Zookeeper選舉保證只有一個HMaster節點保持活躍,其余的處于備用。
HBase客戶端通過 RPC方式 與 HMaste節點 和 HRegionServer節點 通信,HMaster節點連接Zookeeper獲得HRegionServer節點的狀態并對其進行管理。HBase的系統架構。
由于 HBase 將底層數據存儲于HDFS中,因此也設計 NameNode節點 和 DataNode節點等,HRegionServer 經常與 HDFS 的 DataNode 在同一個節點,有利于數據的本地訪問,節省網絡傳輸時間。
HMaster 主要作用:
HMaster不用于存儲HBase的任何數據,而是管理HRegionServer節點,指定HRegionServer 節點可以管理哪些 HRegion,實現負載均衡。
當HRegionServer宕機時,HMaster 會將其中的 HRegion 遷移到其他地方HRegionServer上。
管理用戶表的增刪改查等操作。
管理表的元數據(元數據主要保存HRegion的唯一標識符和HRegionServer的映射關系)
權限控制
HBase**使用 rowkey 自動把表水平切分為多個叫 HRegion區域 ,每個 HRegion 由表中的多行數據組成。**最初一個表只有一個 HRegion ,隨著數據的增多便會在某行的邊界上將表分割成兩個大小基本相同的 HRegion。后由HMaster節點將HRegion分配到不同的HRegionServer節點中,由HRegionServer對其進行管理以及響應客戶端的讀寫請求。分布在集群中的所有HRegion 按照序列排列就成了一張表。
每一個HRegion 都記錄了rowkey 的 起始行鍵(startkey) 和 結束行鍵(endkey),**第一個HRegion的 startkey 和 最后一個 Hregion 的 endkey 為空。**客戶端可以通過 HMaster 節點快速定位到每一個rowkey 所在的 HRegion。
一個Store 存儲 HBase 表中的一個列族的數據。由于一個表被水平分割為多個 HRegion,那么一個HRegion 中包含一個或多個 Store。一個Store包含一個 MemStore 和 多個 HFile。
MemStore 相當于一個內存緩沖區,數據存入磁盤之前會先存入 MemStore。
當 MemStore 達到某一大小,會生成一個 HFile 文件,MemStore 的數據的數據會移到 HFile 中,StoreFile 是對 HFile 文件的封裝,HFile 是 HBase 底層的數據存儲格式,最終數據以 HFile 的格式存儲在HDFS中。
需要注意的是,一個HFile文件只存放某個時刻 MemStore 中的所有數據,一個完整的行數據可能存放于多個 HFile 里。
HLog 是 HBase 的日志文件,記錄數據的更新操作。與 RDBMS 數據庫類似,為了保證 數據的一致性和實現回滾的操作,HBase 在寫數據時候會先進行 WAL(預寫日志)操作。即將更新操作寫入 HLog 中后,才會將數據寫入到 Store 的 MenStore 中,兩個地方都寫入成功,才會認為數據寫入成功。
由于MenStore是寫入內存,數據達到一定量的時候才會寫入到HDFS,如果在寫入到HDFS 之前服務器宕機,MemStore 中的數據丟失,還可以通過 HLog 來恢復數據。
**HLog在HDFS中,**所以服務器崩潰,HLog仍可用。
每一個 HRegionServer 節點會在 Zookeeper 中注冊一個自己的臨時節點,HMaster 通過這些臨時節點發現可用的 HRegionServer 節點,跟蹤 HRegionServer 的節點故障。
HBase 利用 Zookeeper 來確保只有一個活動的 HMaster 在運行。
HRegion 應該分配到哪個 HRegionServer 節點上,也是通過 Zookeeper 得知的。
關于HBase 分布式數據庫的原理及搭建是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。