一:HBase簡介
(一)HBase了解(實現對大<普通PC集群、十億行,百萬列>數據隨機、實時存取操作)
前提:
基於Hdfs的查詢由於其存儲機制的限制,導致查詢速度響應緩慢,無法解決一些對速度有要求的場景;
傳統數據庫雖然查詢快,但是無法支撐海量數據。因此就出現了HBase這種"數據庫"。
HBase是一個高可靠、高性能、面向列、可伸縮的分布式數據庫,是建立在hdfs之上,被設計用來提供高可靠性,高性能、列存儲、可伸縮、多版本,的Nosql的分布式數據存儲系統(相對於文件系統查詢等操作效率更高,實時性更高),實現對大型數據的實時,隨機的讀寫請求。更是彌補了hive不能低延遲、以及行級別的增刪改的缺點。
HBASE依賴於hdfs做底層的數據存儲 HBASE依賴於MapReduce做數據計算 HBASE依賴於zookeeper做服務協調
HBase基於Hdfs作為默認推薦的存儲引擎,采用基於kv結構的存儲方式,內部基於LSM算法進行數據排序,可以支持基於rowkey的快速檢索,但是不適合復雜的數據分析,比如join,group等。
另外:相對於其他關系型數據庫《優點:主要用於處理復雜的表與表之間關系,進行各自關聯查詢》,而HBase不提供表與表之間的關聯查詢(對於關系的處理很弱---也用不到分表),只進行簡單的查詢數據,幾乎沒有事務特性
二:HBase邏輯架構
(一)傳統數據庫結構
傳統的數據庫需要事先定義數據表的結構,並指定數據的類型,一旦創建就不能改變,修改的代價比較高。
而HBase則是采用kv的存儲方式,按照列族把不同的數據組織在一起。
(二)HBase數據庫結構
要查詢某一個具體字段的值,需要指定坐標:表名--->行鍵--->列族(ColumnFamily):列名(Qualifier)--->版本
三:HBase數據組織形式(大到小)
namespace:命名空間
一般就是邏輯上用於表的區分,類似數據庫中的database。在最終物理文件存儲的時候,會根據namespace切分目錄。
table:表
類似於數據庫中的table
column family:列族
相同列族的列會存放在一起。
row:行
由基於字符串的rowkey唯一指定,rowkey全局不能重復,按照字典序順序存儲,rowkey的設計對最終的查詢起到關鍵性作用。
column:列
用於存放字段的數據內容。
version:版本
如果數據存在多個版本,那么每個時間戳(版本)會對應一個數據。
四:物理架構
HBase底層基於hdfs構建,因此最終數據都存儲於hdfs中。整個HBase有三種核心角色:
Master:負責節點的管理 RegionServer:負責數據的讀寫 Client:維護連接池,緩存元數據
另外Zookeeper是一個不可缺少的角色,查詢或者寫入都依賴於zk,因為zk中存儲了元數據位置的相關信息。
因此可以看到,HBase中的Master其實是一個相對弱化的Master。
五:HBase核心組件RegionServer
HBase中核心的組件就是這個RegionServer,它是由WAL和Region組成。
WAL是一種順序寫入的日志,全稱是write ahead log,主要用於備份數據,當機器宕機后內存中的數據丟失,可以通過預寫日志進行恢復。
Region是主要的存儲結構,一個Region就代表一個數據分片,HBase默認提供了很多分片的機制,也可以在創建表時自定義分片。
Region內部由多個Store組成,每個Store代表一個列族,查詢的時候也是每個Store單獨進行查詢。
Store由memstore和Hfile組成,一般一個列族對應一個Store。新的數據寫入時,會先記錄在WAL中,然后存儲在內存中的memstore。
當數據量到達一定的閾值時,memstore中的數據會形成HFile寫入hdfs。讀數據的時候,會從memstore以及Hfile中讀取。
六:HBase尋址過程
HBase采用三級尋址方式(不會再多級了,因為每級尋址范圍夠大),並且客戶端不會每次都從頭查詢數據位置,會在客戶端建立緩存,提高查詢效率(因為空間、時間就近,極有可能 重復查詢該數據或者數據附件數據)
七:HBase體系架構
Client
包含訪問HBase的接口並維護cache來加快對HBase的訪問
Zookeeper
保證任何時候,集群中只有一個master
存貯所有Region的尋址入口。
實時監控Region server的上線和下線信息。並實時通知Master
存儲HBase的schema和table元數據
Master
為Region server分配region
負責Region server的負載均衡
發現失效的Region server並重新分配其上的region
管理用戶對table的增刪改操作
RegionServer
Region server維護region,處理對這些region的IO請求
Region server負責切分在運行過程中變得過大的region
HLog(WAL log)---存放最新最新數據和操作(小文件)
– HLog文件就是一個普通的Hadoop Sequence File,Sequence File 的Key是 HLogKey對象,HLogKey中記錄了寫入數據的歸屬信息,
除了table和 region名字外,同時還包括sequence number和timestamp,timestamp是” 寫入時間”,sequence number的起始值為0,
或者是最近一次存入文件系 統中sequence number。
– HLog SequeceFile的Value是HBase的KeyValue對象,即對應HFile中的 KeyValue
Region
– HBase自動把表水平划分成多個區域(region),每個region會保存一個表 里面某段連續的數據;每個表一開始只有一個region,隨着數據不斷插 入表,
region不斷增大,當增大到一個閥值的時候,region就會等分會 兩個新的region(裂變);
– 當table中的行不斷增多,就會有越來越多的region。這樣一張完整的表 被保存在多個Regionserver上。
Memstore 與 storefile
– 一個region由多個store組成,一個store對應一個CF(列族)
– store包括位於內存中的memstore和位於磁盤的storefile寫操作先寫入 memstore,當memstore中的數據達到某個閾值,
hregionserver會啟動 flashcache進程寫入storefile,每次寫入形成單獨的一個storefile
– 當storefile文件的數量增長到一定閾值后,系統會進行合並(minor、 major compaction),在合並過程中會進行版本合並和刪除工作 (majar),
形成更大的storefile。
– 當一個region所有storefile的大小和超過一定閾值后,會把當前的region 分割為兩個,並由hmaster分配到相應的regionserver服務器,實現負載均衡。
– 客戶端檢索數據,先在memstore找,找不到再找storefile (會將搜索的最多的數據存放在memstore中,而不用去讀取storefile)
– HRegion是HBase中分布式存儲和負載均衡的最小單元。最小單元就表 示不同的HRegion可以分布在不同的HRegion server上。
– HRegion由一個或者多個Store組成,每個store保存一個columns family。
– 每個Strore又由一個memStore和0至多個StoreFile組成。
如圖:StoreFile 以HFile格式保存在HDFS上。
八:應用場景
從上面的架構可以看出HBase適合海量數據、基於列的存儲,並且列比較稀疏的場景。典型的應用場景有:
1 用戶畫像
用戶畫像在精准營銷、個性化推薦等場景都有很重要的意義。因此每個用戶是一個rowkey,不同的用戶所擁有的畫像標簽不一樣,可以用不同的column來表示。在精准營銷的場景,則可以根據營銷的粒度(如店鋪),在用戶Id前面拼接店鋪id,查詢的時候可以通過指定開始和結束的范圍,實現快速查詢。
2 用戶行為
如果要分析單個用戶的行為,則可以通過設計某個字段最大版本數,存儲用戶的各種行為數據。當需要分析時,可以搭配Impala或者presto(需要自定義數據源),基於rowkey快速抓取用戶行為鏈路,進行分析。
九:安裝HBase
(一)確保zk集群安裝完畢
(二)要把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下
(三)修改hbase-env.sh環境配置文件
export JAVA_HOME=/home/hadoop/App/jdk1.8.0_241 //告訴hbase使用外部的zk export HBASE_MANAGES_ZK=false
(四)修改hbase-site.xml配置文件
<configuration> <!-- 指定hbase在HDFS上存儲的路徑 --> <property> <name>hbase.rootdir</name> <value>hdfs://ns1/hbase</value> //無法解析,所以需要我們拷貝Hadoop下的兩個配置文件 </property> <!-- 指定hbase是分布式的 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 指定zk的地址,多個用“,”分割 --> <property> <name>hbase.zookeeper.quorum</name> <value>hadoopH5:2181,hadoopH6:2181,hadoopH7:2181</value> </property> </configuration>
(五)配置regionservers節點信息,修改regionservers文件
hadoopH5
hadoopH6
hadoopH7
(六)拷貝文件到其他節點(可以刪除文檔目錄再傳)
hadoopH3本地上傳到hadoopH4、H5、H6、H7。使用scp命令進行
(七)HBase啟動測試
會自動在啟動節點中設置Master
注意在hadoopH4中也啟動一個master用於設置高可用
./hbase-daemon.sh start master
web頁面訪問:
通過kill一個master可以測試另一個的使用,實現HA: