文章目錄
一、HBase介紹
HBase是一個開源的非關係型數據庫,是根據谷歌的論文Big Table設計開發的。HBase是一個高可靠、高性能、面向列、可伸縮的分佈式數據庫,主要用來存儲非結構化和半結構化的鬆散數據。HBase的目標是處理非常龐大的表,可以通過水平擴展的方式,利用廉價計算機集羣處理由超過10億行數據和數百萬列元素組成的數據表。
1、HBase出現的原因?
• hadoop雖然已經有了HDFS和mapreduce,但是隻能很好的解決大規模數據的離線批量處理問題。無法滿足大規模數據實時處理應用的需求。
• 並且HDFS面向批量訪問模式,不是隨機訪問模式
• 傳統的關係型數據庫無法應對結構化和半結構的數據以及數據規模劇增的情況
2、HBase和傳統的關係型數據庫的區別
方面 | 傳統的關係型數據庫 | Hbase |
---|---|---|
數據類型 | 有豐富的數據類型和存儲方式,數據類型固定 | 數據類型不固定,把數據存儲爲未經解釋的字符串 |
數據操作 | 有複雜的多表連接關係 | 只有簡單的插入、查詢、刪除、清空等,不存在複雜的表與表之間的關係 |
存儲模式 | 基於行 | 基於列,每個列族由幾個文件保存,不同列族的文件是分離的 |
數據索引 | 針對不同列構建複雜的多個索引 | 只有一個索引,行鍵 |
數據維護 | 更新操作會用最新的值去替換原來的值,被覆蓋後就不存在 | HBase更新操作時,不會刪除數據舊的版本,舊的新的都會存在 |
可伸縮性 | 關係型數據庫很難實現橫向擴展,縱向擴展的空間也有限 | HBase是分佈式數據庫實現了靈活的水平擴展,可以隨意的增加or減少硬件數量實現性能的伸縮 |
3、HBase數據類型
對上圖的解釋
- 表:HBase採用表來組織數據,表由行和列組成,列劃分爲若干列族。
- 行:每個HBase表都由若干行組成,每個行由行鍵(row key)來標識。
- 列族:一個HBase表被分組成許多“列族”(Column Family)的集合,它是基本的訪問控制單元。
- 列名:列族裏的數據通過限定符(或列)來定位。
- 單元格:在HBase表中,通過行、列族和列限定符確定一個“單元格”(cell),單元格中存儲的數據沒有數據類型,總被視爲字節數組byte[](第一個表的一個格子就是單元格)
對key value的解釋
- Row Length:存儲rowkey的長度,佔2B (Bytes.SIZEOF_INT);
- Row:存儲Rowkey實際內容,其大小爲Row Length ;
- Column Family Length:存儲列簇Column Family的長度,佔1B (Bytes.SIZEOF_BYTE);
- Column Family:存儲Column Family實際內容,大小爲Column Family Length;
- Column Qualifier:存儲Column Qualifier對應的數據。
- Time Stamp:存儲時間戳Time Stamp,佔8B (Bytes.SIZEOF_LONG);
- Key Type:存儲Key類型Key Type,佔1B ( Bytes.SIZEOF_BYTE),Type分爲Put、Delete、DeleteColumn、DeleteFamilyVersion、DeleteFamily、Maximum、Minimum等類型,標記這個KeyValue的類型;--------->由於Key中其它的字段佔用大小已經知道,並且知道整個Key的大小,因此沒有存儲Column Qualifier的大小。
4、HBase的架構
- Zookeeper:作爲分佈式的協調。RegionServer也會把自己的信息寫到ZooKeeper中,主用Master據此感知各個RegionServer的健康狀態。
- Client使用HBase的RPC機制與Master、RegionServer進行通信。Client與Master進行管理類通信,與RegionServer進行數據操作類通信。
- HDFS:是Hbase運行的底層文件系統,HBase的數據全部存儲在HDFS中
- RegionServer:理解爲數據節點,存儲數據的。
- Hmaster:分爲主用master和備用master
- 主用Master:負責HBase中RegionServer的管理,包括表的增刪改查;RegionServer的負載均衡,Region分佈調整;Region分裂以及分裂後的Region分配;RegionServer失效後的Region遷移等。
- 備用Master:當主用Master故障時,備用Master將取代主用Master對外提供服務。故障恢復後,原主用Master降爲備用。
- MemStore:當RegionServer中的MemStore大小達到配置的容量上限時,RegionServer會將MemStore中的數據“flush”到HDFS中。
- StoreFile:隨着數據的插入,一個Store會產生多個StoreFile,當StoreFile的個數達到配置的最大值時,RegionServer會將多個StoreFile合併爲一個大的StoreFile。
- Hfile:HFile定義了StoreFile在文件系統中的存儲格式,它是當前HBase系統中StoreFile的具體實現。
- Hlog:HLog日誌保證了當RegionServer故障的情況下用戶寫入的數據不丟失,RegionServer的多個Region共享一個相同的Hlog。
5、HBase讀寫流程
HBase讀流程
- HRegionServer 保存着 meta 表以及表數據,要訪問表數據,首先 Client 先去訪問
zookeeper,從 zookeeper 裏面獲取 meta 表所在的位置信息,即找到這個 meta 表在哪個
HRegionServer 上保存着。 - 接着 Client 通過剛纔獲取到的 HRegionServer 的 IP 來訪問 Meta 表所在的HRegionServer,從而讀取到 Meta,進而獲取到 Meta 表中存放的元數據。
- Client 通過元數據中存儲的信息,訪問對應的 HRegionServer,然後掃描所在
HRegionServer 的 Memstore 和 Storefile 來查詢數據。 - 最後 HRegionServer 把查詢到的數據響應給 Client。
HBase寫流程
- Client 也是先訪問 zookeeper,找到 Meta 表,並獲取 Meta 表信息。
- 確定當前將要寫入的數據所對應的 RegionServer 服務器和 Region。
- Client 向該 RegionServer 服務器發起寫入數據請求,然後 RegionServer 收到請求並響應。
- Client 先把數據寫入到 HLog,以防止數據丟失。
- 然後將數據寫入到 Memstore。
- 如果 Hlog 和 Memstore 均寫入成功,則這條數據寫入成功。在此過程中,如果 Memstore達到閾值,
會把 Memstore 中的數據 flush 到 StoreFile 中。 - 當 Storefile 越來越多,會觸發 Compact 合併操作,把過多的 Storefile 合併成一個大的Storefile。
當 Storefile 越來越大,Region 也會越來越大,達到閾值後,會觸發 Split 操作,將 Region 一分爲二。
二、Hbase部署
環境前提
zookeeper正常部署
hadoop正常部署
1、解壓HBase
解壓HBase到/export/service
2、修改配置文件
vim hbase-env.sh
vim hbase-site.xml
這個是Hbase的主配置文件,你可以指定hbase和ZooKeeper數據寫入的目錄,當然也可以指定hbase的根目錄在哪個位置
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/export/data/zk/</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01,node02,node03</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
</configuration>
vim regionservers
3、啓動節點
1、啓動zk集羣 ./zkServer.sh start
2、啓動hdfs集羣: start-dfs.sh
3、啓動hbase,在主節點上運行(node01):start-hbase.sh
4、頁面訪問hbase管理頁面:
node01:16010
5、進入shell命令行 :hbase shell
三、HBase簡單使用
- 查看幫助命令
hbase(main):001:0> help
- 查看當前數據庫有哪些表
hbase(main):002:0> list
- 表的創建
hbase(main):003:0> create 'student','info'
- 插入數據到表
put 'student','1001','info:name','mike'
put 'student','1001','info:age','22'
put 'student','1002','info:name','marco'
put 'student','1001','info:sex','female'
- 掃描查看數據
hbase(main) > scan 'student' //掃描全表
hbase(main) > scan 'student',{STARTROW => '1001', STOPROW => '1001'} //掃描指定範圍
- 查看錶結構:
hbase(main):008:0> describe 'student'
- 刪除數據:
hbase(main) > delete 'student','1002','info:sex'
- 查看指定行或者指定行:指定列
hbase(main) > get 'student','1001'
hbase(main) > get 'student','1001','info:name'
- 更新字段
put 'student','1001','info:name','star'
- 清空表數據
truncate ‘student’
- 刪除表
drop ‘student’