HBase
簡介: HBase是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統。可在廉價PC Server上搭建起大規模結構化存儲集羣。
HBase利用Hadoop HDFS作爲其文件存儲系統,利用Hadoop MapReduce來處理HBase中的海量數據,利用Zookeeper作爲協調工具。 HBase與傳統數據庫(RDBMS)的最大區別面向列。操作數據庫,如果是索引訪問用HBase+Hadoop
當前市場上有很多類似的序列化系統,如Avro、Google 的 Protocol Buffers、Facebook 的 Thrift。
Apache Thrift 是 Facebook 實現的一種高效的、支持多種編程語言的遠程服務調用的框架。
HBase是Hadoop生態系統的一個組成部分。如圖:
HBase與HDFS對比:
兩者都具有良好的容錯性和擴展性,都可以擴展到成百上千個節點; HDFS適合批處理場景但不支持數據隨機查找,不適合增量數據處理,不支持數據更新。
HBase表的特點:
- 大:一個表可以有數十億行,上百萬列;
- 無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中不同的行可以有截然不同的列;
- 面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索;
- 稀疏:對於空(null)的列,並不佔用存儲空間,表可以設計的非常稀疏;
- 數據多版本:每個單元中的數據可以有多個版本,默認情況下版本號自動分配,是單元格插入時的時間戳;
- 數據類型單一:HBase中的數據都是字符串,沒有類型
爲什麼要使用hbase?
- 傳統關係型數據庫系統已無法適應大型分佈式數據存儲的需要
- 改良的關係數據庫(副本、分區等)難於安裝與維護
- 關係模型對數據的操作使數據的存貯變得複雜
- HBase從設計理念上就爲可擴展做好了充分準備。
- 空間的擴展只需要加入存儲結點,使用表的概念,但不同於關係數據庫,實質上是一張極大的、非常稀疏的,存儲在分佈式文件系統上的表
HBase數據模型
表:Tables 由 rows 和 columns 組成。數據存放在帶標籤的表中。HBase中的每一張表,就是所謂的BigTable。稀疏表。
單元格:Table cells單元格有版本(Timestamp是HBase插入單元格時候的時間戳)。
時間戳( Timestamp ):時間戳,每次數據操作對應的時間戳,可以看作是數據的version number。是一個 64 位整數
列:列組成“列族”
列族:所有的列族成員有相同的前綴。物理上,所有的列族成員都一起存放在文件系統中。HBase實際上就是一個面向列族的存儲器。Table在水平方向有一個或者多個列簇組成,一個列簇中可以有任意多個列組成
RowKey:二進制值byte[],按字典順序排序。行鍵,Table的主鍵,Table中的記錄按照Row Key排序
ColumnKey:二進制值byte[],按字典順序排序。是表中每條記錄的“主鍵”,方便快速查找
value:一個未解釋的字節數組byte[]。
注意:表中的不同行可以擁有不同數量的成員。即支持“動態模式”模型
HBase數據模型中 行 的特點:
- 字符串、整數、二進制串甚至串行化的結構都可以作爲行鍵
- 表按照行鍵的“逐字節排序”順序對行進行有序化處理
- 表內數據非常‘稀疏’,不同的行的列的數完全目可以大不相同
- 可以只對一行上“鎖”
- 對行的寫操作是始終是“原子”的
HBase數據模型中 列 的特點
- 列必須用‘族’(family)來定義
- 任意一列有如下形式:“族:標籤”。其中,族和標籤都可爲任意形式的串
- 物理上將同“族”數據存儲在一起
- 數據可通過時間戳區分版本
HBase架構體系
-
Client:包含訪問HBase的接口,client維護着一些cache 來加快對HBase的訪問,比如region的位置信息
-
Zookeeper:
- 保證任何時候,集羣中只有一個running master
- 存貯所有Region的尋址入口
- 實時監控Region Server 的狀態,將Region server 的上線和下線信息,實時通知給Master
- 存儲HBase的schema,包括有哪些table,每個table有哪些column family
-
Master:可以啓動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master運行
- 爲Region server 分配region
- 負責region server 的負載均衡
- 發現失效的region server 並重新分配其上的region
-
Region Server:
- 維護Master 分配給它的region,處理對這些 region 的 IO 請求
- 負責切分在運行過程中變得過大的region
注意:
HBase中有兩張特殊的Table:-ROOT-
和.META.
-
.META.:記錄了用戶表的Region信息,.META.可以有多個regoin
-
-ROOT-:記錄了.META.表的Region信息,-ROOT-只有一個region
Zookeeper中記錄了-ROOT-表的location
Client訪問用戶數據之前需要首先訪問zookeeper,然後訪問-ROOT-表,接着訪問.META.表,最後才能找到用戶數
據的位置去訪問
HBase的shell操作
啓動HBase:
start-hbase.sh
啓動HBase shell:
hbase shell
退出HBase shell:
quit
幫助命令:
help
查看集羣狀態
status
創建表:create '表名稱', '列族名稱1','列族名稱2','列族名 稱N'
create 'users','user_id','address','info'
添加記錄:put '表名稱', '行名稱', '列名稱:', '值'
put 'users','xiaoming','info:age','24';
查看記錄:get '表名稱', '行名稱'
get 'users','xiaoming' #取得一個id的所有數據
get 'users','xiaoming','info' #獲取一個id,一個列族的所有數據
get 'users','xiaoming','info:age' #獲取一個id,一個列族中一個列的所有數據
查看錶中的記錄總數:count '表名稱'
count 'users'
刪除記錄:delete '表名' ,'行名稱' , '列名稱'
delete 'users','xiaoming','info:age'
刪除整行:deleteall '表名' , '行名稱'
deleteall 'users','xiaoming'
刪除一張表:先要屏蔽該表,才能對該表進行刪除。1、disable '表名稱'
。2、drop '表名稱'
disable 'users'
drop 'users'
注意:修改表結構或者刪除表,需要先disable
查看所有記錄:scan "表名稱"
scan 'test' #查看test表中的所有數據
查看某個表某個列中所有數據:scan "表名稱" ,'列族名稱:列名稱'
scan 'test','info:age'
清空表:truncate '表名'
truncate 'users'
獲取單元格數據的版本數據:
get 'users','xiaoming',{COLUMN=>'info:age',VERSIONS=>1}
列出全部表:
list
得到表的描述:describe '表名'
describe 'users'
查看錶的狀態 :exists '表名'
exists 'users'
is_enabled 'users'
is_disabled 'users
使表有效或無:enable/disable '表名'
enable 'users'
disable 'users'
HBase的組件:
- HMaster
-
管理用戶對Table的增、刪、改、查操作
-
管理RegionServer的負載均衡、調整Region的分佈
-
在Region Split後,將新Region分佈到不同的RegionServer。
-
在RegionServer宕機後,該RegionServer上所管理的Region 由HMaster進行重新分配。
-
- HRegionServer
- RegionServer是HBase集羣運行在每個工作節點上的服務組件
- RegionServer維護Master分配給它的region,處理對這些region的IO請求
- Region server負責切分在運行過程中變得過大的region
- Region
- Region可理解爲關係型數據庫中的“分區”
- 處理RegionServer分配給它的任務
HBase的組件單元:
-
表空間:在關係數據庫系統中,命名空間 namespace 指的是一個表的邏輯分組,同一組中的表有類似的用途。有兩個默認表空間:
- hbase:系統命名空間,用於包含hbase的內部表
- default:所有未指定命名空間的表都自動進入該命名空間
-
表:HBase以表的形式存儲數據,表在 hdfs 上以文件夾形式存(HBase表組成模型在上面)
HBase vs Oracle
- 索引不同造成行爲的差異
- HBase適合大量插入同時又有讀的情況
- HBase的瓶頸是硬盤傳輸速度,Oracle的瓶頸是硬盤尋道時間
- HBase很適合尋找按照時間排序top n的場景
HBase寫入數據流程:
-
Client通過Zookeeper調度獲取表的元數據信息;
-
Cilent通過rpc協議與RegionServer交互,通過-ROOT-表與.META.表找到對應的對應的Region;
-
將數據寫入HLog日誌中,如出現意外可以同通過HLog恢復信息;
-
將數據寫入Region的MemStore中,當MemStore達到閾值開始溢寫,將其中的數據Flush成一個StoreFile;
-
MemStore不斷生成新的StoreFile,當StoreFile的數量到達閾值後會出發Compact合併操作,將多個StoreFile合併成一個StoreFile;
-
StoreFile文件會不斷增大,當達到閾值後會出發Split操作,把當前的Region且分爲兩個新的Region。父Region會下線,兩個子Region會被HMaster分配到相應的RegionServer。
HBase查詢數據流程:
-
Client訪問Zookeeper,從ZK獲取-ROOT-表的位置信息,通過訪問-ROOT-表獲取.META.表的位置,然後確定數據所在的HRegion位置;
-
Client訪問HRegion所在的HRegionServer,通過HRegionServer獲取需要查找的數據;
-
Client到HRegion的中去查找數據,首先到MemStore中查找,查到直接返回;查不到就去ClockCache中查找,查到直接返回;再查不到就去StoreFile中讀數據,把讀到的數據存入BlockCache中再返回Client。
表設計和調優
內存優化:
HBase 操作過程中需要大量的內存開銷,畢竟 Table 是可以緩存在內存中的,一般會分配整個可用內存的 70%給 HBase 的 Java 堆。但是不建議分配非常大的堆內存,因爲 GC 過 程持續太久會導致 RegionServer 處於長期不可用狀態,一般 16~48G 內存就可以了,如果因 爲框架佔用內存過高導致系統內存不足,框架一樣會被系統服務拖死。
rowkey優化的主要方式:
一條數據的唯一標識就是 RowKey,那麼這條數據存儲於哪個分區,取決於 RowKey 處 於哪個一個預分區的區間內,設計 RowKey 的主要目的 ,就是讓數據均勻的分佈於所有的 region 中,在一定程度上防止數據傾斜。
- 生成隨機數、hash、散列值
- 字符串反轉
- 字符串拼接
基礎優化:
1、允許在 HDFS 的文件中追加內容
-
文件:hdfs-site.xml、hbase-site.xml
-
屬性:dfs.support.append
-
解釋:開啓 HDFS 追加同步,可以優秀的配合 HBase 的數據同步和持久化。默認值爲 true。
2、優化 DataNode 允許的最大文件打開數
-
文件:hdfs-site.xml
-
屬性:dfs.datanode.max.transfer.threads
-
解釋:HBase 一般都會同一時間操作大量的文件,根據集羣的數量和規模以及數據動作, 設置爲 4096 或者更高。默認值:4096
3、優化延遲高的數據操作的等待時間
-
文件:hdfs-site.xml
-
屬性:dfs.image.transfer.timeout
-
解釋:如果對於某一次數據操作來講,延遲非常高,socket 需要等待更長的時間,建議把 該值設置爲更大的值(默認 60000 毫秒),以確保 socket 不會被 timeout 掉。
4、優化數據的寫入效率
-
文件:mapred-site.xml
-
屬性:mapreduce.map.output.compress 、mapreduce.map.output.compress.codec
-
解釋:開啓這兩個數據可以大大提高文件的寫入效率,減少寫入時間。第一個屬性值修改爲
true,第二個屬性值修改爲:org.apache.hadoop.io.compress.GzipCodec 或者其 他壓縮方式。
5、設置 RPC 監聽數量
-
文件:hbase-site.xml
-
屬性:Hbase.regionserver.handler.count
-
解釋:默認值爲 30,用於指定 RPC 監聽的數量,可以根據客戶端的請求數進行調整,讀寫 請求較多時,增加此值。
6、優化 HStore 文件大小
-
文件:hbase-site.xml
-
屬性:hbase.hregion.max.filesize
-
解釋:默認值 10737418240(10GB),如果需要運行 HBase 的 MR 任務,可以減小此值, 因爲一個 region 對應一個 map 任務,如果單個 region 過大,會導致 map 任務執行時間 過長。該值的意思就是,如果 HFile 的大小達到這個數值,則這個 region 會被切分爲兩個Hfile。
7、優化 HBase 客戶端緩存
-
文件:hbase-site.xml
-
屬性:hbase.client.write.buffer
-
解釋:用於指定 Hbase 客戶端緩存,增大該值可以減少 RPC 調用次數,但是會消耗更多內 存,反之則反之。一般我們需要設定一定的緩存大小,以達到減少 RPC 次數的目的。
8、指定 scan.next 掃描 HBase 所獲取的行數
-
文件:hbase-site.xml
-
屬性:hbase.client.scanner.caching
-
解釋:用於指定 scan.next 方法獲取的默認行數,值越大,消耗內存越大。
9、flush、compact、split 機制
當 MemStore 達到閾值,將 Memstore 中的數據 Flush 進 Storefile;compact 機制則是把 flush 出來的小文件合併成大的 Storefile 文件。split 則是當 Region 達到閾值,會把過大的 Region 一分爲二。
有關安裝:
安裝HBase:
- 添加用戶:
#adduser hadoop //useradd #開頭表示root操作
#cat /etc/passwd
#ls /home/
#su hadoop
- 修改opt權限:
chmod -R 777 /opt
- 上傳WinSCP:jdk、hadoop、hbase
- 解壓縮:
tar zxvf /tmp/jdk-8u241-linux-x64.tar.gz
(tar zxvf filename可以解壓縮.tar.gz
文件) - 創建env.sh:
#!/bin/bash
export JAVA_HOME=/opt/jdk
export PATH=.:$JAVA_HOME/bin:$PATH
- 導入:#root身份,文件末尾,加入 source /opt/env.sh 或者 . /opt/env.sh
- 關閉防火牆
- 查詢防火牆狀態:
systemctl status firewalld
- 臨時關閉:
systemctl stop firewalld
- 永久關閉:systemctl disable firewalld
- 查詢防火牆狀態:
- 關閉SELinux
- 查詢:
sestatus -v
或者getenforce
- 臨時關閉:
setenforce 0
。0設置 SELinux 成爲 permissive 模式,1設置爲 enforcing 模式 - 永久關閉:
vim /etc/selinux/config, 將SELINUX=enforcing改爲SELINUX=disabled
- 查詢:
- SSH免密碼登錄:
- 查看狀態:
systemctl status sshd
- 生成密鑰:
ssh-keygen -t rsa
,生成文件在:~/ .ssh/
- 將密鑰copy到授權文件:cp id_rsa.pub authorized_keys。授權文件:authorized_ keys
- 連接測試:
ssh localhost
。ssh遠程登錄服務使用的端口號是22
- 查看狀態:
- 修改hostname和hosts
- 往/opt/env.sh中添加hadoop和HBase的環境變量
- 修改hadoop的配置文件
- 啓動hadoop:
start-dfs.sh
start-yarn.sh
。登錄網絡界面檢查:http://192.168.100.11:50070 - 修改Hbase配置文件:hbase-env.sh、hbase-site.xml、regionservers
- 啓動hbase:
start-hbase.sh
hbase shell
。檢查hbase:http://192.168.100.11:16010 - 停止HBase:stop-hbase.sh
使用python操作(CentOS7):
- 連接外網
- 確認Python3安裝:
python3
顯示Python 3.6.8 (default, Aug 7 2019, 17:28:10)
- 安裝 Thrift:
pip3 install thrift
- 安裝Python-devel開發包:
yum install python3-devel
。Centos 7中安裝軟件包提示"python.h: 沒有那個文件或目錄", 可以安裝python3-devel解決此問題 - 安裝Happybase:
pip3 install happybase
- 回到普通用戶:
pip3 list
- 啓動集羣 hadoop+hbase:
- 啓動 thrift:
hbase-daemon.sh start thrift
- 驗證:
ps aux|grep thrift
或jps
- 運行示例,查詢API:https://happybase.readthedocs.io/en/latest/
使用java操作:
-
下載安裝Eclipse,Eclipse IDE for Java Developers
https://www.eclipse.org/downloads/packages/ -
下載安裝jdk(Windows)
https://www.oracle.com/java/technologies/javase-jdk8-downloads.html -
下載安裝Maven
https://maven.apache.org/download.cgi -
設置jdk、maven環境變量:
JAVA_HOME、CLASSPATH、PATH、MAVEN_HOME
-
驗證jdk、maven安裝:java -version、javac -version、mvn -version
-
修改maven配置:
apache-maven-3.6.3\conf\settings.xml
<localRepository>本地路徑</localRepository> <!-- 配置maven路徑 -->
- 下載Maven依賴庫:
mvn help:system
成功提示:BUILD SUCESS
- 修改windows解析:hosts 文件
- 查詢修改windows防火牆
- 添加HBase jar包
- 消除WARN,添加log4j.properties文件
- 消除hadoop error,windows環境變量添加HADOOP_HOME,添加winutils.exe文件
補充:
HBase高可用配置,涉及的配置文件名稱backup-masters
H、PATH、MAVEN_HOME5. 驗證jdk、maven安裝:java -version、javac -version、mvn -version 6. **修改maven配置:**
apache-maven-3.6.3\conf\settings.xml`
<localRepository>本地路徑</localRepository> <!-- 配置maven路徑 -->
- 下載Maven依賴庫:
mvn help:system
成功提示:BUILD SUCESS
- 修改windows解析:hosts 文件
- 查詢修改windows防火牆
- 添加HBase jar包
- 消除WARN,添加log4j.properties文件
- 消除hadoop error,windows環境變量添加HADOOP_HOME,添加winutils.exe文件
補充:
HBase高可用配置,涉及的配置文件名稱backup-masters
HBase分佈式安裝時需要將配置文件中的HBase.cluster.distributed值修改爲true