前言:
在大數據領域有一個非常著名的產品-hbase,其有別於傳統的rdbms,被稱之爲列式數據庫。那麼什麼是列式數據庫呢?既然有列,那是不是也有行式數據庫呢?
行式數據庫:可以簡單的理解爲是傳統的rdbms這些數據庫,存放的是結構化的數據,非常有利於全表數據的掃描,但是相對來說,對於個別字段的掃描,就不那麼方便了。
列式數據庫:列式數據庫是對行式數據庫的一個改進,將部分列(或者說有關聯的一些列)存放到單獨的一個文件中,其他列存在其他多個文件中,我們在進行 查詢的時候,只需要讀取這些常用的列即可完成工作,這樣減少了文件IO的讀寫,提高讀寫的效率(不用再像行式數據庫那樣進行全表的掃描,然後過濾相關字段)。
一、hbase簡介
1.是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統,
2.HBase利用Hadoop HDFS作爲其文件存儲系統,利用Hadoop MapReduce來處理HBase中的海量數據,(利用zookeeper作爲協調工具)。
3.特點
(1)hbase自身的特點
①高可靠性
②高性能
③面向列
④可伸縮
(2)hbase中表的特點
①可以縱向擴展
②可以橫向擴展
二、hbase體系結構
1.邏輯結構(重點)
①表(table)
劃分數據集合的概念,和傳統的db中的表的概念是一樣的。
②行鍵(rowkey)
一行數據的唯一標識,若想要操作hbase表中的一條數據,必須通過行鍵來定位,行鍵在hbase底層是使用字節數組進行存放的,所以方便我們使用rowkey來進行排序。
一行數據的唯一標示,要想操作(read/write)一條數據,必須通過行健,其在hbase底層都是使用字節數組進行存放,所以方便我們使用rk進行排序,
③列族(columnFamily)
簡單的認爲是一系列“列”的集合,列族是以單獨的文件來進行存儲的。
④列限定符(column Qualifier)
通常稱之爲列。列裏邊的數據定位通過列限定符,每個列族可以有一個或多個列成員(ColumnQualifier)。列成員不需要再定義表時規定,後期新加就可以了,可以動態注入。每個新加的列都會附帶一個時間戳。在單元格中可以存放多個版本的數據。
⑤單元格(cell)
cell由行鍵,列族:限定度,時間戳唯一決定的,cell中的數據時沒有類型的,全部以字節碼形式存儲,在使用java api去請求hbase數據時,所得的數據基本都存儲在cell中。
2.物理結構(重點)
①HMaster --- 類似於hadoop的NameNode
作用:管理節點,用於管理hbase中的Table和Region的結構操作,比如用戶增、刪、修改表的操作。
在hbase集羣中,可以啓動多個HMaster,但是隻能有一個HMaster屬於Active的狀態,通過zookeeper和其他standby狀態的HMaster進程完成狀態的切換或者選舉。
我們可以使用HMaster的shutdown來關閉整個集羣,在關閉整個集羣的時候,需要通知HRegionServer進行關閉,並反饋給HMaster,HMaster才自行關閉。
②HRegionServer --- 類似於hadoop中的DataNode
存放Region的服務器,需要再HMaster進行註冊,只有註冊成功後,HMaster纔可以對其進行管理,在HBase集羣中,可以部署多個HregionServer。HRegionServer是hbase中最核心的模塊,直接負責對用戶I/O的相應,直接向hdfs讀寫數據,一個HRegionServer中擁有一個HLog和多個HRegion。
按這樣來說,一個HRegionServer中的多個HRegion共享一個HLog,也就是說多張表共享一個HLog,HLog接受用戶的操作數據,當然HRegion也會寫數據,當HRegion數據寫入成功之後,會發送一條刪除數據的指令(數據寫入成功的指令),Hlog的相關數據會首次被標記刪除,等到一個閾值後,Hlog會執行一次文件的大合併(major Compact)。
③HRegion
其是真正用來存儲數據的,而且它可以簡單的理解爲表的一個分區,存放一張表中的一部分數據,當該region中的數據超過一定數量的時候,會自動分裂成兩個region(一分爲二),從這個角度上而言,Region是對hbase中表橫向的劃分。
每一個HRegion有多個HStore組成,每一個HRegion是一張表中所有的列組成的(列是所有的列,但不一定是所有的行),每一個region都有一個startkey和endkey。
假設,我一張表裏面有100條記錄,我要把它分別存放到10個region裏面,又因爲存放在hbase裏面的數據都是有序的,是能夠進行一個高速隨機讀寫的
也就是說有序能夠保證我的快讀,就需要能夠通過rowkey,快速的定位到當前記錄在哪一個region裏面,然後當定位到region之後,再去掃描當前region,獲取數據
爲了滿足於此,我們就對這些region進行劃分,編號,也是爲了方便管理。這裏每一個region的範圍:
[startKey, endKey),需要注意一定最後一個region的endkey是需要被包含進去的。
region 0 [null, 10)
region 1 [10, 20)
region 2 [20, 30)
region ... ...
region 9 [90, null]④HStore
④ HStore
每一個HRegion由多個HStore來組成,一個HStore對應HRegion中的一個列族,一個HStore有一個MemStore和一系列的StoreFiles組成。
HStore級別不會持有鎖以及事務,鎖和事務是在高一級別的HRegion持有的,HStore最核心的一個service就是合併memstore刷新到磁盤裏邊的storefiles,然後把多個storefiles合併成爲一個storefile,寫到hdfs裏邊,當storefile寫到hdfs後就會被稱爲hfile。
在寫的過程中,唯一涉及到hlog的部分就是關於hlog日誌的重建過程,當hstore將用戶提交的數據最終寫到hdfs之後,會反饋給hlog,並將其裏邊冗餘的數據刪除掉。
可以在配置文件中指定hstore數量爲多少時開啓hstore的合併工作。
hbase.hstore.compactionThreshold=3, --代表黨hstore數量爲3時,開始store的合併工作。
拓展:
①Compaction:
minjor compaction(小合併):
就是將多個HFile合併成爲一個大的HFile,然後對之前的HFile做清除處理。
常見的會在執行刪除數據的動作、以及達到hbase.hstore.compactionThreshold觸發條件的時候發生
刪除數據:不會立即刪除,做一個標記(標記刪除),等到執行合併操作的時候,才進行數據的處理
marjor compaction(大合併):
將一個列族中的所有的HFile合併成爲一個HFile,然後對之前的HFile做清除處理。
大合併非常消耗性能,非常耗時,不建議操作,當然是直接可以在shell執行操作的。
②把在HBase中的HLog存在的意義稱之爲WAL(write ahead log,預寫日誌)機制,這種機制有對應的專業的數據結構
SLM-Tree(Structured Log Merge-Tree), 這是HBase能夠達到高速隨機寫,而且能夠保障數據不丟失根本原因。
⑤memstore
注意:在memstore寫的過程中,必須不能是多線程(並行)調用的,hstore在調用的過程中必須持有一個讀鎖和寫鎖。
在寫的過程中,預先將數據在memstore中進程排序,因爲數據最終是有序存放的,當memstore中的數據量超過閾值之後,就會舒心到磁盤文件 storefile中。
hbase.hregion.memstore.flush.size=128M,storeFile 默認的大小就是128M---->剛好對應了一個datanode的block塊的大小
⑥storeFile
最終保存在HStore數據的文件,數據時有memstore不斷向磁盤刷新過程中產生的,當storefile達到一定量的時候,會將這些
storefile組成一個storefiles。,且這個storefiles有可能持有其他store裏邊的storefile。
⑦HFlie
在hdfs上存放數據之前的一個物理結構,用於接收從客戶端提交過來的數據。
HFile中的數據都是key-value鍵值對的方式存儲,並且key和value都是字節數組,並且因爲數據已經在memstore中排序過了,所以數據在hfile中也是有序的。
hfile同時是由一個個的block來組成的,最終k-v實際上是在這一個個的block中的,block的推薦的大小在8k~1M之間,默認
大小65536byte-->16kb。
三、hbase的安裝
1.軟件環境
(1)我現在使用hbase的版本是hbase-1.2.5
(2)hadoop
(3)zookeeper
(4)java
hadoop、zookeeper的安裝我會在以後的文章中爲大家介紹的~或者大家可以先在網上找一些資料,學習怎麼去安裝~
2.單機版本
(1)解壓
tar -zxvf soft/hbase-1.2.5-bin.tar.gz
(2)將hbase添加至環境變量
vi /etc/profile
export HBASE_HOME=/opt/hbase
(3)修改配置文件
在安裝hbase時,主要是修改兩個配置文件,hbase-env.sh和hbase-site.xml
hbase-env.sh:
在這裏配置比較簡單,只要添加兩條記錄即可。
export JAVA_HOME=/opt/jdk
export HBASE_MANAGES_ZK=false -- (這裏指明不適用hbase自己的zookeeper,要使用我們安裝的)
hbase-site.xml :
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>master</value>
</property>
(4) 啓動
sh $HBASE_HOME/bin/start-hbase.sh
在這個時候,我們使用jps命令,當HMaster、HRegionServer兩個進程都啓動的時候,這證明我們的單機hbase已經啓動成功了,見以下兩張圖,因爲我搭建的是集羣,所有HMaster、HRegionServer沒有在一臺服務器上。
(5)停止
sh $HBASE_HOME/bin/stop-hbase.sh
(6)單個進程啓動
HMaster的啓動: hbase-daemon.sh start master
HRegionserver的啓動: hbase-daemon.sh start regionserver
(7)訪問
web訪問: http://127.0.0.1:16010
cli訪問: bin/hbase shell
3.分佈式安裝
(1)既然我們已經完成了單機安裝,那麼分佈式的安裝也就比較簡單了,只需要在單機的版本上新增一個配置文件conf/regionservers, 並在其內添加兩個節點(兩行):
slave01
slave02
注意:如果已經配置過單機版,我們需要將hbase在hdfs上的目錄,以及hbase在zk中的目錄清楚,以免和我們的集羣版本操作發生衝突。
(2)修改配置文件hbase-site.xml
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,slave01,slave02</value>
</property>
(3)拷貝master上面的數據到slave01和slave02
scp -r /opt/hbase root@slave01:/opt
scp -r /opt/hbase root@slave02:/opt
同樣在slave01和slave02上面添加相關環境變量
scp /etc/profile root@slave01:/etc/profile.d/
scp /etc/profile root@slave02:/etc/profile.d/
注意:在我們每次修改環境變量後,一定別忘記使用souce命令使其生效。
注意:在我們每次修改環境變量後,一定別忘記使用souce命令使其生效。
注意:在我們每次修改環境變量後,一定別忘記使用souce命令使其生效。
(4)啓動hbase集羣
sh $HBASE_HOME/bin/start-hbase.sh
這個時候在master機器上面,有一個進程HMaster,在slave01和slave02上面分別有一個HRegionServer (如上面截圖)
至此,我們hbase的簡單介紹以及安裝已經介紹完了,希望對大家能夠有所幫助~