hbase 安装_HBASE 数据库入门级教程
一、Hbase簡介
1、什么是Hbase
Hbase是一個高可靠性(存儲在hdfs上,有副本機制),高性能,面向列,非關系型的數據庫(類似redis),可伸縮的分布式存儲系統(因為是存儲在hdfs上),hbase的目標是存儲并處理大型的數據,僅需使用普通的硬件,就能夠處理由成千上萬行和列所組成的大型數據。
Hbase是基于hdfs構建的分布式存儲框架,但是Hbase在hdfs上實現隨機的讀寫改,解決了hdfs不支持的東西
它的的特點如下:
A、海量存儲
B、列式存儲
這里的列式存儲其實說的是列族存儲,Hbase是根據列族來存儲數據的,列族下面可以有非常多的列,列族在創建表的時候必須指定
Hbase中的列和mysql的列不是一個東西,Hbase的列就是他的數據
C、極易擴展
Hbase的擴展性主要體現在兩個方面,一個是基于上層的梳理能力的擴展(RegionServer,相當于datanode,處理讀寫請求),一個是基于存儲的擴展(hdfs)
通過橫向添加RegionServer的機器,進行水平擴展,提升Hbase上層的處理能力,提升Hbase服務更多的Region的能力。
備注:RegionServer的作用是管理Region)(類似mysql中的表的概念),承接客戶端的讀寫請求的訪問,這個后面會詳細的介紹通過橫向添加datanode的機器,進行存儲層的擴容,提升Bhbase的存儲能力和提升后端存儲的讀寫能力
D、稀疏
稀疏主要是針對于hbase列的靈活性,在列族中,你可以指定任意多的列,在列數據為空的情況下,是不會占用存儲空間的,這里和mysql等數據庫不一樣,mysql如果每個字段沒有值,那這個字段的值為null,不為空,且會占用存儲空間
2、Hbase的架構
Hbase的架構示意圖
Hbase由HMaster和HRegionServer組成,HMaster的高可用也依賴于zk,類似于hdfs中的Namenode;
HRegionServer相當于hdfs中的datanode,實際處理讀寫請求的節點;
a、Zookeeper
HBase通過zk來做Hmaster的高可用,RegionServer的監控,元數據的入口以及集群配置的維護等工作,具體工作入下
通過zk來保證集群中只有一個master在運行,如果master異常,會通過競爭機制產生新的master提供服務
通過zk來監控RegionServer的狀態,當RegionServer有異常的時候,通過回調的形式通知master,RegionServer上下線的信息
通過zk存儲元數據的統一入口地址;
b、HMaster
為RegionServer分配Region
維護集群的負載均衡,就是分配Region
維護集群的元數據信息
發現失效的Region,并將失效的Region分配到正常的RegionServer上
當RegionServer失效的時候,協調對應的Hlog和hdfs的block進行數據恢復
C、HRegionServer
HRegionServer直接對接用戶的讀寫請求,是真正的干活的節點,他的功能概括如下
管理master為其分配的Region
處理來自客戶端的讀寫請求
負責和底層hdfs的交互,存儲數據到hdfs中
負責Region變大后的拆分
負責Storefile的合并工作
D、HDFS
Hdfs為hbase提供最終的底層數據存儲服務
提供元數據和表數據的底層分布式存儲服務
數據的多副本,保證高可靠和高可用
E、Hlog
一個HRegionServer中只有一個Hlog,Hlog相當于hdfs中的edits文件,保存Hbase的修改記錄,當對Hbase寫數據的時候,數據不是直接寫進磁盤,他會在內存中保留一段時間(時間i將數據量的閾值可以設定)。但把數據保存在內存中可能有更高的概率引起數據丟失,為了解決這個問題,數據會先寫在一個叫做Hlog的文件中,Hlog存儲在磁盤上,也位于hdfs上,然后在寫入內存,所以在系統出現故障或者內存丟失的時候,數據可以通過這個日志文件進行重建
F、Region
Region相當于mysql中的表,一個HRegionServer可以有多個Region,一個HRegionServer會有多個Region;如果表的數據太大,會進行拆分,按照數據量平均切分,所有HBase中的一張表會對應一個或者多個Region,當表的內容很小,一張表就對應一個Region,如果表很大的話,則這個Region會切分,切分Region會同時拆分這個Region的所有Store。
G、Store
Store相當于列族,通俗的講就是列的家族,在hbase中,想創建一個列,必須要指定列族,也就是一個列必須屬于某個列族。一個表中可以有多個列族,一個store對應一個列族,hbase官方不建議多個列族,一個列族就可以搞上百個列,足夠用了。但是如果一個HRegion被切分的話,是切分列族,所以就算一個HRegion只有一個列表,切分后一個Region也會對應多個Store,多個strore會被分配到其他的HRegionServer節點進行存儲
H、MemStore
MemStore就是列族中的數據放在內存中,寫數據來了,會寫到內存中,只要內存寫入成功,則就返回。
I、StoreFile
StoreFile,數據放在內存不安全,而且有大小限制,所以需要把內存中的數據寫到磁盤中,以Hfile的格式存儲在hdfs上。每次memstore刷一次,形成一個storefile,所以storefile會很多,但是很小,因為內存本身就不大,后面storeFile也會合并,但是這個合并也僅僅是一個列族內部的StoreFile進行合并,不會跨列族合并的
J、HFile
這是磁盤上保存的原始數據的實際的物理文件,是實際的存儲文件,storefile是以Hfile的形式存儲在hdfs中
二、Hbase安裝
1、首先要安裝zk
2、 然后要安裝hdfs
3、 最后在安裝hbase
4、 解壓,修改配置文件
這里重點說下修改配置文件,前面的就不說了,因為我在實際使用過程中使用ambari工具來進行安裝
首先修改hbase-env.sh,配置java的環境變量
export JAVA_HOME=/usr/lib/jvm/java配置zk
export HBASE_MANAGES_ZK=falseHbase也是強依賴于zookeeper的,是否要啟用自己的zookeeper。如果用則為true,如果用外部的zookeeper,則為false
配置hbase-site.xml
<property> <name>hbase.rootdirname> <value>/apps/hbase/datavalue> property>配置hbase是否啟用集群
<property> <name>hbase.cluster.distributedname> <value>truevalue> property>設置Hbase的服務的端口號,不是 web的端口號,web的端口號是16010
<property> <name>hbase.master.info.portname> <value>16010value> property><property> <name>hbase.master.portname> <value>16000value>property>
配置要連接的zk
<property> <name>hbase.zookeeper.quorumname> <value>abdi1,abdi2,abdi3value>property>Zk存儲數據的父目錄,主要是為了區分多個hbase集群
<property> <name>zookeeper.znode.parentname> <value>/hbase-unsecurevalue>property>配置regionservers文件
指定RegionServer的節點
由于hbase是強依賴于hdfs的,需要拷貝hdfs的配置文件到hbase的conf目錄
我們一般情況會這樣操作,創建一個軟鏈接,鏈接到hdfs的core-site.xml和hdfs-
site.xml中,就是讓hbase知道我要連接哪個hadoop集群
但是在ambari安裝的hbase的配置文件中沒有找到相應的配置,但是在hbase啟動的時候有加載hdfs的環境變量
啟動hbase,可以看到有Hmaster和HRegionServer的java進程
Ambari 的 web 頁面顯示效果如下
注意:Hbase的Master和RegionServer安裝是一樣的,只是看我們是否要啟動 master
Hbase的web頁面,采用16010端口
三、Hbase的shell操作
1、進入hbase shell
[root@n?bin]#?/usr/hdp/current/hbase-client/bin/hbase?shell2、查看當前有哪些表:list
hbase(main):003:0> list TABLE 0 row(s) Took 0.2713 seconds => [] hbase(main):004:0>3、創建表操作。這里的列族是必須要指定的,就是和mysql的列一樣:create "student","info"
hbase(main):004:0> create "student","info" Created table student Took 1.3445 seconds => Hbase::Table - student hbase(main):005:0> hbase(main):006:0> list TABLE student 1 row(s) Took 0.0055 seconds => ["student"]4、插入數據。Hbase中的數據沒有什么類型,比如字符串,hash等,全部是字節:put
"student","1001","info:name","laowang"
hbase(main):007:0> put "student","1001","info:name","laowang" Took 0.1217 seconds hbase(main):008:0> put "student","1001","info:age","18" Took 0.0038 seconds hbase(main):009:0> put "student","1001","info:sex","male" Took 0.0049 seconds hbase(main):010:0> put "student","1002","info:name","laoluo" Took 0.0036 seconds hbase(main):011:0> put "student","1002","info:age","20" Took 0.0035 seconds5、掃描查看數據:scan “student”
6、掃描查看數據,指定起始和截止Rowkey, ?前閉后開
7、 ?查看指定Rowkey
8、 ?查看指定行的指定列
9、 ?更新數據
10、 ?查看表結構
重點關注列族和版本即可,這里的版本是個數的意思,就一條數據存儲幾個版本
11、 ?修改列族的版本信息
多更新幾次數據
可以查看到有多個版本,這里的意思查看 ?3 ?個版本的數據,所以有三條,下面的命令是查看 ?2 ?個版本的數據,所以有兩條
12、 ?刪除操作
刪除某個 ?Rowkey ?的指定列,可以看到其他列的數據還在,刪除還可以指定時間戳,該時間戳之前的數據都會被刪除
刪除 ?Rowkey ?對應的所有數據
13、統計條數
統計條數, ?Rowkey ?有幾個,條數就有幾條
image
14、清空表
15、刪除表
16、命名空間(namespace)操作
命令空間,相當于數據庫中的 ?database
所有的表都是命名空間的成員,如果不指定,則默認在 ?default ?的命名空間中
命名空間可以設置權限,比如定義訪問控制列表,例如創建表,讀取表,刪除,更新操作,權限用的很少
Shell ?命令查看 ?namespace ?、創建 ?namespace
Hbase ?就是存儲元數據的命名空間,是系統自己用的,不能給用戶使用
在指定命名空間下建表
四、Hbase的數據結構
1、Rowkey
Rowkey ?是用來檢索記錄的主鍵,訪問 ?Hbase table ?中的行,只有三種方式
A、 ?通過單個 ?Rowkey ?訪問
B、 ?通過 ?Rowkey ?的 ?range ?訪問
C、 ?全表掃描
設計 ?Rowkey ?非常重要也是 ?Hbase ?里最重要的一門學問,數據會按照 ?Rowkey ?的字典序排序進行存儲,所以設計 ?Rowkey
要利用這個特性,把經常一起讀取的行存儲在一起,學習Hbase,Rowkey設計是學習的重點
2、Column Family
列族, ?Hbase ?表中的每個列,都會屬于某個列族,列族是表的結構的一部分,列族在建表的時候必須要指定。列名都是以列族做為前綴。
在創建表的時候需要指定列族,列族可以指定多個
3、Cell
由 ?Rowkey ?, ?column Family ?:column ?, ?version ?唯一確定的單元, ?cell
中的數據是沒有類型的,全部都是字節的形式存儲
4、Time Stamp
時間戳,每個 ?cell ?都保存著同一份數據的多個版本,版本通過時間戳來索引。時間戳可以由系統生成,也可以自己指定。每個 ?cell
中,不同版本的數據按照時間倒序排列,即最新的數據在最前面
通過時間戳不同來確定版本的
五、Hbase的原理
Hbase ?的寫比讀還快
1、讀流程, ?hmaster ?沒有關系, ?hmaster ?掛掉后,不影響讀流程
a、先獲取 ?meta ?表的位置,也就元數據這張表存儲的位置
b、 ?去 ?meta ?表所在位置獲取 ?meta ?表的信息, ?meta ?表存儲的內容大致入下
Student 0 ----10000 rs1Student 100001---20000 rs2Stff 0---10000 rs3Stff 10000—200000 rs4c、 ?然后在去對應的 ?regionserver ?獲取對應的數據
d、 ?獲取數據,先去內存中獲取,如果內存中沒有,到 ?blockcache ?中獲取,如果 ?blockcash
沒有,則去磁盤獲取,這里為什么先去內存獲取數據?
e、 ?返回數據的時候,先把數據寫到 ?blockcache ?中,然后在返回給 ?client
Meta ?表的位置
Zk ?上查看 ?meta ?表的存儲位置
查看meta表的內容
2、 ?寫流程,和Hmaster沒有關系
a、client ?到 ?zk ?獲取 ?meta ?表的位置
b、Zk ?返回 ?meta ?表的位置
c、Zk ?去 ?regionserver ?讀取 ?meta ?表的內容
d、Regionserver ?將 ?meta ?表的內容返回
e、去對應的 ?regionserver ?開始執行寫操作,先寫 ?Hlog ?文件,然后寫到 ?memstore ?,成功后,立刻返回,寫入流程完成
因為先寫到內存中,那么什么時候會刷到硬盤中呢
a、Regionserver ?的使用的總內存達到堆內存的 ?40%
b、 ?滿足一個小時的條件,會刷 ?memstore ?到硬盤中
c、單個 ?region ?里的所有的 ?Memstore ?加起來達到 ?128MB ?,則會刷 ?memstore ?到硬盤中
這樣就會有很多小文件刷到 ?hdfs ?中,但是 ?hdfs ?不適合存儲很多的小文件
默認是 ?7 ?天做一次合并
超過 ?7 ?天合并 ?storefile ?文件
超過 ?3 ?個 ?storefile ?文件,會進行合并
這個是合并一個列族的的 ?storefile ?,不同列族的 ?storefile ?文件不會進行合并的
3、高可用
Hmaster是Active ?和 ?standby ?模式
高可用配置
總結
以上是生活随笔為你收集整理的hbase 安装_HBASE 数据库入门级教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python pdf库_3个Python
- 下一篇: html打印日志_SpringBoot