Hbase入門詳解
1、hbase概述
1.1 hbase是什么
hbase是基于hdfs進(jìn)行數(shù)據(jù)的分布式存儲,具有高可靠、高性能、列存儲、可伸縮、實(shí)時讀寫的nosql數(shù)據(jù)庫。
hbase可以存儲海量的數(shù)據(jù),并且后期查詢性能很高,可以實(shí)現(xiàn)上億條數(shù)據(jù)的查詢秒級返回結(jié)果。
1.2 hbase表的特性
1、大
- hbase表可以存儲海量的數(shù)據(jù)。
2、無模式
- mysql表中每一行列的字段是相同,而hbase表中每一行數(shù)據(jù)可以有截然不同的列。
3、面向列
- hbase表中的數(shù)據(jù)可以有很多個列,后期它就是按照不同的列去存儲數(shù)據(jù),寫入到不同的文件中。
- 面向列族進(jìn)行存儲數(shù)據(jù)。
4、稀疏
- 在hbase表中為null的列并不占用實(shí)際的存儲空間。
5、數(shù)據(jù)的多版本
- 對于hbase表中的數(shù)據(jù)在進(jìn)行數(shù)據(jù)更新的時候,它并沒有把之前的結(jié)果數(shù)據(jù)直接刪除掉,而是保留數(shù)據(jù)的多個版本,每一個數(shù)據(jù)都給一個版本號,這個版本號就是按照我們插入數(shù)據(jù)的時間戳去確定。
6、數(shù)據(jù)類型單一
- 無論是什么類型的數(shù)據(jù),最后都被轉(zhuǎn)換成了字節(jié)數(shù)組存儲在hbase表中
1.3 hbase表的邏輯視圖
2、hbase的集群結(jié)構(gòu)
1、client
- 提供了對hbase表操作的一些java接口。
- client 維護(hù)著一些 cache 來加快對 hbase 的訪問
- client 會將查詢過的位置信息保存緩存起來,緩存不會主動失效
2、zookeeper
客戶端操作hbase表數(shù)據(jù)需要一個zk集群
作用
1、zk保存了hbase集群的元數(shù)據(jù)信息
存儲 Hbase 的 schema,包括有哪些 table,每個 table 有哪些 column family
2、zk保存所有hbase表的尋址入口
后期通過客戶端接口去操作hbase數(shù)據(jù)的時候,需要連接上zk集群
存貯所有 Region 的尋址入口----root 表在哪臺服務(wù)器上3、通過引入了zk之后,實(shí)現(xiàn)了整個hbase集群高可用
4、zk保存了HMaster和HRegionServer它們的注冊和心跳信息
后期哪一個HRegionServer掛掉之后,zk也會感知到,然后把這個信息通知給老大HMaster
3、HMaster
它是整個hbase集群老大
作用
1、它接受客戶端創(chuàng)建表、刪除表的請求。處理 schema 更新請求
2、它會給HRegionServer分配對應(yīng)的region,進(jìn)行數(shù)據(jù)的管理
3、它會把掛掉的HRegionServer所管理的region重新分配給其他的活著的HRegionServer
4、它會實(shí)現(xiàn)HRegionServer負(fù)載均衡,避免某一個HRegionServer管理的region過多。
4、HRegionServer
它是整合hbase集群的小弟
作用
1、負(fù)責(zé)管理HMaster老大給它分配的region
2、它會接受到客戶端的讀寫請求
3、它會把在運(yùn)行過程中,變得過大的region數(shù)據(jù)進(jìn)行切分
5、Region
它是整個hbase表中分布式存儲的最小單元
它的數(shù)據(jù)是基于hdfs進(jìn)行存儲
3、hbase集群安裝部署
前提條件
- 先搭建好zk、hadoop集群
1、下載對應(yīng)的安裝包
- http://archive.apache.org/dist/hbase/1.2.1/hbase-1.2.1-bin.tar.gz
- hbase-1.2.1-bin.tar.gz
2、規(guī)劃安裝目錄
- /export/servers
3、上傳安裝包到服務(wù)器中
4、解壓安裝包到指定的規(guī)劃目錄
- tar -zxvf hbase-1.2.1-bin.tar.gz -C /export/servers
5、重命名解壓目錄
- mv hbase-1.2.1 hbase
6、修改配置文件
需要把hadoop安裝目錄下/etc/hadoop文件夾中
- core-site.xml
- hdfs-site.xml
需要把以上2個hadoop的配置文件拷貝到hbase安裝目錄下的conf文件夾中
1、vim hbase-env.sh
#配置java環(huán)境變量 export JAVA_HOME=/export/servers/jdk #指定hbase集群由外部的zk集群去管理,不在使用自帶的zk集群 export HBASE_MANAGES_ZK=false
2、vim hbase-site.xml
<!-- 指定hbase在HDFS上存儲的路徑 --> <property> <name>hbase.rootdir</name> <value>hdfs://node1:9000/hbase</value> </property> <!-- 指定hbase是分布式的 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 指定zk的地址,多個用“,”分割 --> <property> <name>hbase.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property>
3、vim regionservers
#指定哪些節(jié)點(diǎn)是HRegionServer node2 node3
4、vim backup-masters
#指定哪些節(jié)點(diǎn)是備用的Hmaster node2
7、配置hbase環(huán)境變量
vim /etc/profile
export HBASE_HOME=/export/servers/hbase export PATH=$PATH:$HBASE_HOME/bin
8、分發(fā)hbase目錄和環(huán)境變量
scp -r hbase node2:/export/servers scp -r hbase node3:/export/servers scp /etc/profile node2:/etc scp /etc/profile node3:/etc
9、讓所有hbase節(jié)點(diǎn)的環(huán)境變量生效
在所有節(jié)點(diǎn)上執(zhí)行
- source /etc/profile
4、hbase集群的啟動和停止
1、啟動hbase集群
先啟動zk和hadoop集群
然后通過hbase/bin
start-hbase.sh
- 你在哪里啟動這個腳本,首先在當(dāng)前機(jī)器啟動一個HMaster進(jìn)程(它就是活著的HMaster)
- 通過regionservers文件在對應(yīng)的節(jié)點(diǎn)來啟動HRegionServer
- 通過backup-masters文件在對應(yīng)的節(jié)點(diǎn)來啟動備用的HMaster
2、停止hbase集群
通過hbase/bin
stop-hbase.sh
hbase集群web管理界面
1、啟動好hbase集群之后
訪問地址
HMaster主機(jī)名:16010
5、hbase shell 命令行操作
hbase/bin/hbase shell 進(jìn)入到hbase shell客戶端命令操作
1、創(chuàng)建一個表
create 't_user_info','base_info','extra_info' create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}
2、查看有哪些表
list 類似于mysql表中sql:show tables
3、查看表的描述信息
describe 't_user_info'
4、修改表的屬性
#修改列族的最大版本數(shù) alter 't_user_info', NAME => 'base_info', VERSIONS => 3
5、添加數(shù)據(jù)到表中
put 't_user_info','00001','base_info:name','zhangsan' put 't_user_info','00001','base_info:age','30' put 't_user_info','00001','base_info:address','beijing' put 't_user_info','00001','extra_info:school','shanghai' put 't_user_info','00002','base_info:name','lisi'
6、查詢表的數(shù)據(jù)
//按照條件查詢 get 't_user_info','00001' get 't_user_info','00001', {COLUMN => 'base_info'} get 't_user_info','00001', {COLUMN => 'base_info:name'} get 't_user_info','00001',{TIMERANGE => [1544243300660,1544243362660]} get 't_user_info','00001',{COLUMN => 'base_info:age',VERSIONS =>3} //全表查詢 scan 't_user_info'
7、刪除數(shù)據(jù)
delete 't_user_info','00001','base_info:name' deleteall 't_user_info','00001'
8、刪除表
disable 't_user_info' drop 't_user_info'
6、hbase的內(nèi)部原理
- Table 中的所有行都按照 row key 的字典序排列
- Table 在行的方向上分割為多個 Hregion
- region 按大小分割的(默認(rèn) 10G),每個表一開始只有一個 region , region 不斷增大,當(dāng)增大到一個閥值的時候,Hregion 就會等分會兩個新的 Hregion。當(dāng) table中的行不斷增多,就會有越來越多Hregion。
- Hregion 是 Hbase 中分布式存儲和負(fù)載均衡的最小單元。最小單元就表示不同的 Hregion可以分布在不同的 HRegion server 上。
- HRegion 雖然是負(fù)載均衡的最小單元,但并不是物理存儲的最小單元。HRegion 由一個或者多個 Store 組成,每個 store 保存一個 column family。每個 Strore 又由一個 memStore 和 0 至多個 StoreFile 組成。寫操作先寫入 memstore,當(dāng) memstore 中的數(shù)據(jù)量達(dá)到某個閾值(默認(rèn)128M或1個小時),Hregionserver 啟動flashcache 進(jìn)程寫入 storefile,每次寫入形成單獨(dú)一個 storefile。
- 當(dāng) storefile 的個數(shù)超過一定閾值后(默認(rèn)參數(shù) hbase.hstore.blockingStoreFiles=10),多個storeFile會進(jìn)行合并,當(dāng)該region的所有store的storefile大小之和,即所有store的大小超過 hbase.hregion.max.filesize=10G 時,這個 region 會被拆分會把當(dāng)前的 region分割成兩個,并由 Hmaster 分配給相應(yīng)的 region 服務(wù)器,實(shí)現(xiàn)負(fù)載均衡。
- 每個 HRegionServer 中都有一個 HLog 對象,HLog 是一個實(shí)現(xiàn) Write Ahead Log 的類,在每次用戶操作寫入 MemStore 的同時,也會寫一份數(shù)據(jù)到 HLog 文件中, HLog 文件定期會滾動出新的,并刪除舊的文件(已持久化到 StoreFile 中的數(shù)據(jù))。當(dāng) HRegionServer 意外終止后,HMaster 會通過 Zookeeper 感知到,HMaster 首先會處理遺留的 HLog 文件,將其中不同 Region 的 Log 數(shù)據(jù)進(jìn)行拆分,分別放到相應(yīng) region 的目錄下,然后再將失效的 region 重新分配,領(lǐng)取到這些 region 的 HRegionServer 在 Load Region的過程中,會發(fā)現(xiàn)有歷史 HLog 需要處理,因此會 Replay HLog 中的數(shù)據(jù)到 MemStore 中,然后 flush 到 StoreFiles,完成數(shù)據(jù)恢復(fù)。
7、hbase的尋址機(jī)制
尋找 RegionServer
- ZooKeeper–> -ROOT-(單 Region)–> .META.–> 用戶表
-ROOT-表
- 表包含.META.表所在的 region 列表,該表只會有一個 Region;
- root region 永遠(yuǎn)不會被 split,保證了最多需要三次跳轉(zhuǎn),就能定位到任意 region 。
- Zookeeper 中記錄了-ROOT-表的 location。
.META.表
- 表包含所有的用戶空間 region 列表,以及 RegionServer 的服務(wù)器地址
- .META.表每行保存一個 region 的位置信息,row key 采用表名+表的最后一行編碼而成。
- 為了加快訪問,.META.表的全部 region 都保存在內(nèi)存中。
聯(lián)系 regionserver 查詢目標(biāo)數(shù)據(jù)
regionserver 定位到目標(biāo)數(shù)據(jù)所在的 region,發(fā)出查詢請求
region 先在 memstore 中查找,命中則返回
如果在 memstore 中找不到,則在 storefile 中掃描(可能會掃描到很多的 storefile----bloomfilter 布隆過濾器)布隆過濾器可以快速的返回查詢的rowkey是否在這個storeFile中, 但也有誤差, 如果返回沒有,則一定沒有,如果返回有, 則可能沒有
8、Hbase高級應(yīng)用
建表
BLOOMFILTER 默認(rèn)是 Row 布隆過濾器
- 對 ROW,行鍵的哈希在每次插入行時將被添加到布隆。
- 對 ROWCOL,行鍵 + 列族 + 列族修飾的哈希將在每次插入行時添加到布隆
VSRSIONS 默認(rèn)是 1 數(shù)據(jù)版本
- 如果我們認(rèn)為我們的數(shù)據(jù)沒有這么大的必要保留這么多,隨時都在更新,而老版本的數(shù)據(jù)對我們毫無價(jià)值,那將此參數(shù)設(shè)為 1 能節(jié)約 2/3 的空間
COMPRESSION 默認(rèn)值是 NONE 壓縮
- GZIP / LZO / Zippy / Snappy
disable_all ‘toplist.*' disable_all 支持正則表達(dá)式,并列出當(dāng)前匹配的表 drop_all也相同
hbase 表預(yù)分區(qū)----手動分區(qū)
一種可以加快批量寫入速度的方法是通過預(yù)先創(chuàng)建一些空的 regions,這樣當(dāng)數(shù)據(jù)寫入 HBase時,會按照 region 分區(qū)情況,在集群內(nèi)做數(shù)據(jù)的負(fù)載均衡。減少數(shù)據(jù)達(dá)到 storefile 大小的時候自動分區(qū)的
時間消耗,并且還有以一個優(yōu)勢,就是合理設(shè)計(jì) rowkey 能讓各個 region 的并發(fā)請求平均分配(趨于均勻) 使 IO 效率達(dá)到最高,
行鍵設(shè)計(jì)
列族盡量少, 一般2-3個
rowkey
- 根據(jù)字典序的特性, 將需要批量查詢的數(shù)據(jù)盡可能連續(xù)存放( 矛 )
- 盡可能將查詢條件關(guān)鍵詞拼裝到 rowkey 中,查詢頻率最高的條件盡量往前靠
- rowkey建議越短越好,不要超過 16 個字節(jié)
盡量減少行鍵和列族的大小在 HBase 中,value 永遠(yuǎn)和它的 key 一起傳輸?shù)?br /> HFile中每個cell都會存儲rowkey, rowkey過大會影響存儲效率
MemStore 將緩存部分?jǐn)?shù)據(jù)到內(nèi)存,如果 rowkey 字段過長,內(nèi)存的有效利用率就會降低,系統(tǒng)不能緩存更多的數(shù)據(jù),這樣會降低檢索效率。
建議將 rowkey 的高位作為散列字段,由程序隨機(jī)生成,低位放時間字段,這樣將提高數(shù)據(jù)均衡分布在每個 RegionServer,以實(shí)現(xiàn)負(fù)載均衡的幾率。( 盾 )
rowkey矛盾
- HBase 中的行是按照 rowkey 的字典順序排序的,這種設(shè)計(jì)優(yōu)化了 scan 操作,可以將相關(guān)的行以及會被一起讀取的行存取在臨近位置,便于 scan。然而糟糕的rowkey 設(shè)計(jì)是熱點(diǎn)的源頭。
熱點(diǎn)解決
- 加鹽 在rowkey前加隨機(jī)字符串
- 哈希 哈希會使同一行永遠(yuǎn)用一個前綴加鹽
- 反轉(zhuǎn) 反轉(zhuǎn)固定長度或者數(shù)字格式的 rowkey 犧牲了rowkey的有序性
- 時間戳反轉(zhuǎn)
可以用 Long.Max_Value - timestamp 追加到 key 的末尾,例如 [key][reverse_timestamp] ,[key] 的最新值可以通過 scan [key]獲得[key]的第一條記錄,因?yàn)?HBase 中 rowkey 是有序的,第一條記錄是最后錄入的數(shù)據(jù)。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
linux下查看已經(jīng)安裝的jdk 并卸載jdk的方法(推薦)
下面小編就為大家?guī)硪黄猯inux下查看已經(jīng)安裝的jdk 并卸載jdk的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11詳解ubuntu14.04如何設(shè)置靜態(tài)IP的方法
本篇文章主要介紹了ubuntu14.04如何設(shè)置靜態(tài)IP的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07

CentOS MySQL 5.7編譯安裝步驟詳細(xì)說明

Linux搭建自己Nexus私服的實(shí)現(xiàn)方法

Centos7利用內(nèi)存優(yōu)化磁盤緩存讀寫速度的方法