@
HBase 官網地址 https://hbase.apache.org/
HBase 官網檔案 https://hbase.apache.org/book.html
HBase GitHub原始碼地址 https://github.com/apache/hbase
Apache HBase™是以HDFS為資料儲存分散式的、可伸縮的Hadoop NoSQL資料庫。最新版本為2.5.0
HBase支援對巨量資料進行隨機、實時的讀寫存取,可以在商用硬體叢集上託管非常大的表——數十億行X數百萬列。Apache HBase是一個開源的、分散式的、版本化的、非關聯式資料庫,模仿了谷歌開發的Bigtable結構化資料的分散式儲存系統,與Bigtable利用了谷歌檔案系統提供的分散式資料儲存一樣,Apache HBase在Hadoop和HDFS的基礎上提供了類似Bigtable的功能。
HBase 資料模型的關鍵在於稀疏、分散式、多維、排序的對映。其中對映 map 指代非關係型資料庫的 key-Value 結構。
HBase 可以用於儲存多種結構的資料,以 JSON 為例:
{
"row_key1":{
"personal_info":{
"name":"zhangsan",
"city":"北京",
"phone":"131********"
},
"office_info":{
"tel":"010-1111111",
"address":"atguigu"
}
},
"row_key11":{
"personal_info":{
"city":"上海",
"phone":"132********"
},
"office_info":{
"tel":"010-1111111"
}
},
"row_key2":{
......
}
邏輯結構儲存資料稀疏,資料儲存多維,不同的行具有不同的列。資料儲存整體有序,按照RowKey的字典序排列,RowKey為Byte陣列,範例如下:
物理儲存結構即為資料對映關係,而在概念檢視的空單元格,底層實際根本不儲存。
組成角色包含如下幾個部分:
# 下載最新版本HBase
wget --no-check-certificate https://dlcdn.apache.org/hbase/2.5.0/hbase-2.5.0-bin.tar.gz
# 解壓
tar -xvf hbase-2.5.0-bin.tar.gz
# 進入目錄
cd hbase-2.5.0
# 設定環境變數
vim /etc/profile
export HBASE_HOME=/home/commons/hbase-2.5.0
export PATH=$HBASE_HOME/bin:$PATH
# 將組態檔分發到另外兩臺節點上
scp /etc/profile hadoop2:/etc/
scp /etc/profile hadoop3:/etc/
# 在三臺上執行環境變數生成命令
source /etc/profile
# 修改conf目錄下組態檔hbase-env.sh,
vim conf/hbase-env.sh
# false 取消 不需要自己管理範例 用zookeeper
export HBASE_MANAGES_ZK=false
# 宣告JAVA_HOME
export JAVA_HOME=/home/commons/jdk8
# HBase的jar包和Hadoop的jar包有衝突,導致服務沒有起來,報錯如object is not an instance of declaring class可以設定這個
export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true"
##修改,
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
##去掉
<property>
<name>hbase.tmp.dir</name>
<value>./tmp</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
##增加
<property>
<name>hbase.zookeeper.quorum</name>
<value>zk1,zk2,zk3</value>
<description>The directory shared by RegionServers.
</description>
</property>
<!-- <property>-->
<!-- <name>hbase.zookeeper.property.dataDir</name>-->
<!-- <value>/export/zookeeper</value>-->
<!-- <description> 記得修改 ZK 的組態檔 -->
<!-- ZK 的資訊不能儲存到臨時資料夾-->
<!-- </description>-->
<!-- </property>-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop2:9000/hbase</value>
<!--8020這個埠號,要跟hadoop的NameNode一樣-->
<description>The directory shared by RegionServers.
</description>
</property>
hadoop1
hadoop2
hadoop3
cp /home/commons/hadoop/etc/hadoop/core-site.xml conf/
cp /home/commons/hadoop/etc/hadoop/hdfs-site.xml conf/
scp -r /home/commons/hbase-2.5.0 hadoop2:/home/commons
scp -r /home/commons/hbase-2.5.0 hadoop3:/home/commons
# 單點啟動
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver
# 群啟
bin/start-hbase.sh
# 停止服務
bin/stop-hbase.sh
群啟後檢視服務程序
啟動成功後,可以通過「host:port」的方式來存取 HBase 管理頁面, http://hadoop1:16010
在 HBase 中 HMaster 負責監控 HRegionServer 的生命週期,均衡 RegionServer 的負載, 如果 HMaster 掛掉了,那麼整個 HBase 叢集將陷入不健康的狀態,並且此時的工作狀態並不 會維持太久。所以 HBase 支援對 HMaster 的高可用設定。
# 先關閉上面啟動的HBase叢集
bin/stop-hbase.sh
# 在 conf 目錄下建立 backup-masters 檔案
touch conf/backup-masters
# 在 backup-masters 檔案中設定高可用 HMaster 節點
echo hadoop2 > conf/backup-masters
# 將conf/backup-masters scp 到其他節點
scp /home/commons/hbase-2.5.0/conf/backup-masters hadoop2:/home/commons/hbase-2.5.0/conf
scp /home/commons/hbase-2.5.0/conf/backup-masters hadoop3:/home/commons/hbase-2.5.0/conf
# 重啟 hbase
bin/start-hbase.sh
群啟後檢視服務程序,發現多了一個master程序
[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-EteyEUXe-1665312413397)(image-20221009125044450.png)]
開啟頁面測試另一臺master顯示其為備用的Master,主master還是ckserver1也即是hadoop1,檢視http://hadoop2:16010
[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-IePncDF4-1665312413398)(image-20221009125144397.png)]
手動kill -9 殺死ckserver1也即是hadoop1上的HMaster程序,再次檢視http://hadoop2:16010,發現主master已經成功的切換為ckserver2也即是hadoop2
然後再單獨啟動ckserver1也即是hadoop1上的HMaster,執行bin/hbase-daemon.sh start master,這時存取http://hadoop1:16010,發現hadoop1為備用master。
# 進入 HBase 使用者端命令列hbase shell# 檢視幫助命令夠展示 HBase 中所有能使用的命令,主要使用的命令有 namespace 命令空間相關, DDL 建立修改表格,DML 寫入讀取資料。help
# 使用特定的 help 語法能夠檢視命令如何使用。help 'create_namespace'# 建立名稱空間 testcreate_namespace 'test'# 檢視所有的名稱空間list_namespace
# 建立表,在test名稱空間中建立表格 student,兩個列族。info 列族資料維護的版本數為 5 個, 如果不寫預設版本數為 1。create 'test:student', {NAME => 'info', VERSIONS => 5}, {NAME => 'msg'}# 如果建立表格只有一個列族,沒有列族屬性,可以簡寫。如果不寫名稱空間,使用預設的名稱空間 default。create 'student1','info'# 檢視表檢視表有兩個命令:list 和 describe,list:檢視所有的表名,describe:檢視一個表的詳情listdescribe 'student1'
# 修改表表名建立時寫的所有和列族相關的資訊,都可以後續通過 alter 修改,包括增加刪除列族。增加列族和修改資訊都使用覆蓋的方法alter 'student1', {NAME => 'f1', VERSIONS => 3} # 刪除資訊使用特殊的語法alter 'student1', NAME => 'f1', METHOD => 'delete' hbase:016:0> alter 'student1', 'delete' => 'f1'# shell 中刪除表格,需要先將表格狀態設定為不可用。disable 'student1' drop 'student1'
# 寫入資料在 HBase 中如果想要寫入資料,只能新增結構中最底層的 cell。可以手動寫入時間戳指 定 cell 的版本,推薦不寫預設使用當前的系統時間,如果重複寫入相同 rowKey,相同列的資料,會寫入多個版本進行覆蓋。put 'test:student','1001','info:name','zhangsan' put 'test:student','1001','info:name','lisi' put 'test:student','1001','info:age','18' #讀取資料,讀取資料的方法有兩個:get 和 scan。get最大範圍是一行資料,也可以進行列的過濾,讀取資料的結果為多行 cell。get 'test:student','1001' get 'test:student','1001' , {COLUMN => 'info:name'} # 也可以修改讀取 cell 的版本數,預設讀取一個。最多能夠讀取當前列族設定的維護版本數。get 'test:student','1001' , {COLUMN => 'info:name', VERSIONS => 6} # scan 是掃描資料,能夠讀取多行資料,不建議掃描過多的資料,推薦使用 startRow 和 stopRow 來控制讀取的資料,預設範圍左閉右開。scan 'test:student',{STARTROW => '1001',STOPROW => '1002'} # 刪除資料,刪除資料的方法有兩個:delete 和 deleteall;delete 表示刪除一個版本的資料,即為 1 個 cell,不填寫版本預設刪除最新的一個版本。delete 'test:student','1001','info:name'deleteall 'test:student','1001','info:name'
**本人部落格網站 **IT小神 www.itxiaoshen.com