柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 Hbase的簡單學(xué)習(xí)一
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 Hbase的簡單學(xué)習(xí)一
一 Hbase的搭建與安裝
1.1 安裝
1.準(zhǔn)備好文件,上傳到Linux上
2.解壓文件??tar zxvf hbase-2.2.7-bin.tar.gz -C ../
../是解壓到的路徑
1.2 配置文件
1.配置環(huán)境變量 去etc/profile目錄下
export HBASE_HOME=/usr/local/soft/hbase-2.2.7 export PATH=$PATH:$HBASE_HOME/bin
2.修改hbase-site.xml文件
2.修改hbase-env.sh文件
export HBASE_MANAGES_ZK=false export JAVA_HOME=/usr/local/soft/jdk1.8.0_171
3.修改regionservers文件
node1 node2
4.同步一份給子節(jié)點(diǎn)
scp -r hbase-2.2.7 node2:`pwd`
1.3啟動(dòng)
1.hbase啟動(dòng)順序: zk-->hadoop-->hbase
2.命令
a、啟動(dòng)zk 三臺(tái)機(jī)器都要輸入
zkServer.sh start
b、啟動(dòng)Hadoop集群
start-all.sh
c、啟動(dòng)Hbase
start-hbase.sh
1.4 進(jìn)入客戶端
hbase xhell
1.5 進(jìn)入網(wǎng)頁端
http://master:16010/
1.6?退出進(jìn)程的順序
1.先退hbase
stop-hbase.sh
這里注意 關(guān)閉這個(gè)的時(shí)候最好 flush一下 將操作客戶端的表都刷一下,最最好 每次操作一下表就flush ‘表名’ 一下
2. 再退Hadoop集群
stop-all.sh
3 關(guān)閉zk
三臺(tái)機(jī)器都要關(guān)閉
zkServer.sh stop
二 Hbase的相關(guān)概念
2.1 hbase的概述
1.HBase 是一個(gè)高可靠性、高性能、面向列、可伸縮的分布式存儲(chǔ)系統(tǒng),用于存儲(chǔ)海量的結(jié)構(gòu)化或者半結(jié)構(gòu)化,非結(jié)構(gòu)化的數(shù)據(jù)(底層是字節(jié)數(shù)組做存儲(chǔ)的)
2.HBase是Hadoop的生態(tài)系統(tǒng)之一,是建立在Hadoop文件系統(tǒng)(HDFS)之上的分布式、面向列的數(shù)據(jù)庫,通過利用Hadoop的文件系統(tǒng)提供容錯(cuò)能力。如果需要進(jìn)行實(shí)時(shí)讀寫或者隨機(jī)訪問大規(guī)模的數(shù)據(jù)集的時(shí)候,會(huì)考慮使用HBase。
2.2 HBase處理數(shù)據(jù)
1.雖然Hadoop是一個(gè)高容錯(cuò)、高延時(shí)的分布式文件系統(tǒng)和高并發(fā)的批處理系統(tǒng),但是它不適用于提供實(shí)時(shí)計(jì)算;
HBase是可以提供實(shí)時(shí)計(jì)算的分布式數(shù)據(jù)庫,數(shù)據(jù)被保存在HDFS分布式文件系統(tǒng)上,由HDFS保證期高容錯(cuò)性;
但是再生產(chǎn)環(huán)境中,HBase是如何基于hadoop提供實(shí)時(shí)性呢?
HBase上的數(shù)據(jù)是以StoreFile(HFile)二進(jìn)制流的形式存儲(chǔ)在HDFS上block塊兒中;
但是HDFS并不知道的HBase用于存儲(chǔ)什么,它只把存儲(chǔ)文件認(rèn)為是二進(jìn)制文件,也就是說,HBase的存儲(chǔ)數(shù)據(jù)對于HDFS文件系統(tǒng)是透明的。
2.3 hbase與hadoop
2.4 數(shù)據(jù)模型
1.列簇:一個(gè)HBase表被分組成許多“列族”的集合,它是基本的訪問控制單元。
2.行:每個(gè)表由若干行組成,每個(gè)行有一個(gè)行鍵作為這一行的唯一標(biāo)識。訪問表中的行只有三種方式:通過單個(gè)行鍵進(jìn)行查詢、通過一個(gè)行鍵的區(qū)間來訪問、全表掃描。
3.列修飾符(列限定符):列族里的數(shù)據(jù)通過列限定符(或列)來定位
4.單元格:在HBase表中,通過行、列族和列限定符確定一個(gè)“單元格”(cell),單元格中存儲(chǔ)的數(shù)據(jù)沒有數(shù)據(jù)類型,總被視為字節(jié)數(shù)組byte[]
5.時(shí)間戳:每個(gè)單元格都保存著同一份數(shù)據(jù)的多個(gè)版本,這些版本采用時(shí)間戳進(jìn)行索引
2.5 數(shù)據(jù)坐標(biāo)
2.6 區(qū)域
1.HBase自動(dòng)把表水平劃分為區(qū)域(Region),每個(gè)區(qū)域都是有若干連續(xù)行構(gòu)成的,一個(gè)區(qū)域由所屬的表、起始行、終止行(不包括這行)三個(gè)要素來表示。
2.一開始,一個(gè)表只有一個(gè)區(qū)域,但是隨著數(shù)據(jù)的增加,區(qū)域逐漸變大,等到它超出設(shè)定的閾值(128M)大小,就會(huì)在某行的邊界上進(jìn)行拆分,分成兩個(gè)大小基本相同的區(qū)域。然后隨著數(shù)據(jù)的再增加,區(qū)域就不斷的增加,如果超出了單臺(tái)服務(wù)器的容量,就可以把一些區(qū)域放到其他節(jié)點(diǎn)上去,構(gòu)成一個(gè)集群。也就是說:集群中的每個(gè)節(jié)點(diǎn)(Region Server)管理整個(gè)表的若干個(gè)區(qū)域。所以,我們說:區(qū)域是HBase集群上分布數(shù)據(jù)的最小單位
三 Hbase的架構(gòu)
3.1 組件
1.HBase由三種類型的服務(wù)器以主從模式構(gòu)成:
Region Server:負(fù)責(zé)數(shù)據(jù)的讀寫服務(wù),用戶通過與Region server交互來實(shí)現(xiàn)對數(shù)據(jù)的訪問。 HBase HMaster:負(fù)責(zé)Region的分配及數(shù)據(jù)庫的創(chuàng)建和刪除等操作。 ZooKeeper:負(fù)責(zé)維護(hù)集群的狀態(tài)(某臺(tái)服務(wù)器是否在線,服務(wù)器之間數(shù)據(jù)的同步操作及master的選舉等)。
HDFS的DataNode負(fù)責(zé)存儲(chǔ)所有Region Server所管理的數(shù)據(jù),即HBase中的所有數(shù)據(jù)都是以HDFS文件的形式存儲(chǔ)的。出于使Region server所管理的數(shù)據(jù)更加本地化的考慮,Region server是根據(jù)DataNode分布的。HBase的數(shù)據(jù)在寫入的時(shí)候都存儲(chǔ)在本地。但當(dāng)某一個(gè)region被移除或被重新分配的時(shí)候,就可能產(chǎn)生數(shù)據(jù)不在本地的情況。這種情況只有在所謂的compaction之后才能解決。
2.Zookeeper
保證任何時(shí)候,集群中只有一個(gè)master
存貯所有Region的尋址入口。
實(shí)時(shí)監(jiān)控Region server的上線和下線信息。并實(shí)時(shí)通知Master
存儲(chǔ)HBase的schema和table元數(shù)據(jù)的meta信息
3.Master
為Region server分配region
負(fù)責(zé)Region server的負(fù)載均衡
發(fā)現(xiàn)失效的Region server并重新分配其上的region
管理用戶對table的增刪改操作
4.RegionServer
Region server維護(hù)region,處理對這些region的IO請求
Region server負(fù)責(zé)切分在運(yùn)行過程中變得過大的region
5.HLog(WAL log):
HLog文件就是一個(gè)普通的Hadoop Sequence File,Sequence File 的Key是 HLogKey對象,HLogKey中記錄了寫入數(shù)據(jù)的歸屬信息,除了table和 region名字外,同時(shí)還包括sequence number和timestamp,timestamp是” 寫入時(shí)間”,sequence number的起始值為0,或者是最近一次存入文件系 統(tǒng)sequence number。
HLog SequeceFile的Value是HBase的KeyValue對象,即對應(yīng)HFile中的 KeyValue
?6.Region
HBase自動(dòng)把表水平劃分成多個(gè)區(qū)域(region),每個(gè)region會(huì)保存一個(gè)表里面某段連續(xù)的數(shù)據(jù);每個(gè)表一開始只有一個(gè)region,隨著數(shù)據(jù)不斷插 入表,region不斷增大,當(dāng)增大到一個(gè)閥值的時(shí)候,region就會(huì)等分會(huì)兩個(gè)新的region(裂變);
當(dāng)table中的行不斷增多,就會(huì)有越來越多的region。這樣一張完整的表被保存在多個(gè)Regionserver上。
?7.Memstore 與 storefile
一個(gè)region由多個(gè)store組成,一個(gè)store對應(yīng)一個(gè)CF(列簇) store包括位于內(nèi)存中的memstore和位于磁盤的storefile寫操作先寫入 memstore,當(dāng)memstore中的數(shù)據(jù)達(dá)到某個(gè)閾值,hregionserver會(huì)啟動(dòng) flashcache進(jìn)程寫入storefile,每次寫入形成單獨(dú)的一個(gè)storefile 當(dāng)storefile文件的數(shù)量增長到一定閾值后,系統(tǒng)會(huì)進(jìn)行合并(minor、 major compaction),在合并過程中會(huì)進(jìn)行版本合并和刪除工作 (majar),形成更大的storefile。 當(dāng)一個(gè)region所有storefile的大小和超過一定閾值后,會(huì)把當(dāng)前的region 分割為兩個(gè),并由hmaster分配到相應(yīng)的regionserver服務(wù)器,實(shí)現(xiàn)負(fù)載均衡。 客戶端檢索數(shù)據(jù),先在memstore找,找不到再找storefile HRegion是HBase中分布式存儲(chǔ)和負(fù)載均衡的最小單元。最小單元就表 示不同的HRegion可以分布在不同的HRegion server上。 HRegion由一個(gè)或者多個(gè)Store組成,每個(gè)store保存一個(gè)columns family。 每個(gè)Strore又由一個(gè)memStore和0至多個(gè)StoreFile組成。
如圖:StoreFile 以HFile格式保存在HDFS上。
?3.2 理解
1、flush刷新在HDFS上呈現(xiàn)究竟是怎么刷新的呢?? 我們目前剛剛學(xué)習(xí)的時(shí)候,添加數(shù)據(jù),都是一條一條的put進(jìn)去,而我們在put的數(shù)據(jù)比較少(小于128M)的時(shí)候,我們put完去HDFS上并未查看到我們put的文件,這是因?yàn)閿?shù)據(jù)還在內(nèi)存中,也就是還在memStore中,所以要想在HDFS中查看到,我們必須手動(dòng)刷新到磁盤中,這是將memStore的數(shù)據(jù)刷新到StoreFile中去,這樣我們在HDFS中就可以查看到了?! ?/p>
2、為什么Hbase不可以使用像Mysql那樣進(jìn)行查詢?? 首先,我們應(yīng)該可以感受到,我們在插入的時(shí)候,每行數(shù)據(jù),有多少列,列名叫什么完全是我們自己定義的,之所以不支持像MySql那樣對列進(jìn)行查詢和操作,因?yàn)椴淮_定列的個(gè)數(shù)和名稱。
3、數(shù)據(jù)最后存在HDFS上的,HDFS不支持刪改,為什么Hbase就可以呢?? 這里有個(gè)思想誤區(qū),的確,數(shù)據(jù)是以HFile形式存在HDFS上的,而且HDFS的確是不支持刪改的,但是為什么Hbase就支持呢?首先,這里的刪除并不是真正意義上的對數(shù)據(jù)進(jìn)行刪除,而是對數(shù)據(jù)進(jìn)行打上標(biāo)記,我們再去查的時(shí),就不會(huì)查到這個(gè)打過標(biāo)記的數(shù)據(jù),這個(gè)數(shù)據(jù)Hmaster會(huì)每隔1小時(shí)清理。修改是put兩次,Hbase會(huì)取最新的數(shù)據(jù),過期數(shù)據(jù)也是這個(gè)方式被清理。
?四 hbase shell
4.1 help
1.可以通過 help '命名名稱'來查看命令行的具體使用,包括命令的作用和用法。 通過help ‘hbase’ 命名來查看hbase shell 支持的所有命令,hbase將命令進(jìn)行分組,其中ddl、dml使用較多。
4.2 general 類
4.2.1?顯示集群狀態(tài)status
4.2.2?查詢數(shù)據(jù)庫版本version
4.2.3 顯示當(dāng)前用戶與組 whoami
?4.2.4?查看操作表的命令table_help
?4.2.5??退出HBase Shell exit
4.3 DDL
4.3.1. 創(chuàng)建表create
1.創(chuàng)建表時(shí)只需要指定列族名稱,不需要指定列名。
2.語法
create '表名', {NAME => '列族名1'}, {NAME => '列族名2'}, {NAME => '列族名3'} # 此種方式是上上面的簡寫方式,使用上面方式可以為列族指定更多的屬性,如VERSIONS、TTL、BLOCKCACHE、CONFIGURATION等屬性 create '表名', '列族名1', '列族名2', '列族名3'
create '表名', {NAME => '列族名1', VERSIONS => 版本號, TTL => 過期時(shí)間, BLOCKCACHE => true}
3.示例
create 'tbl_user', 'info', 'detail' create 't1', {NAME => 'cf1', VERSIONS => 2}
4.3.2 修改(添加、刪除)表結(jié)構(gòu)Schema alter
1 添加一個(gè)列簇
語法?alter '表名', '列族名'
?2.刪除一個(gè)列簇
語法:alter '表名', {NAME=> '列族名', METHOD=> 'delete'}
示例:alter 't1',{NAME => 'cf2', METHOD => 'delete'}
3. 修改列簇屬性
可以修改列族的VERSIONS、IN_MEMORY
alter 't1', NAME => 'f1', VERSIONS => 5
4.3.3 獲取表的描述describe
1.語法
describe '表名'
4.3.4 列舉所有表list
1.查看的是所有命名空間的表
4.3.5 表是否存在exists
語法:exists '表名'
4.3.6 啟用表enable和禁用表disable
1.通過enable和disable來啟用/禁用這個(gè)表,相應(yīng)的可以通過is_enabled和is_disabled來檢查表是否被禁用。
2.語法:
enable '表名' is_enabled '表名'
disable '表名' is_disabled '表名'
4.3.7 啟用 禁用滿足正則表達(dá)式的所有表enable_all
1.相關(guān)概念
.匹配除“\n”和"\r"之外的任何單個(gè)字符 *匹配前面的子表達(dá)式任意次
2.語法
# 匹配以t開頭的表名 disable_all 't.*' # 匹配指定命名空間ns下的以t開頭的所有表 disable_all 'ns:t.*' # 匹配ns命名空間下的所有表 disable_all 'ns:.*'
4.3.8刪除表drop
1.需要先禁用表,然后再刪除表,啟用的表是不允許刪除的
2.語法:
disable '表名' drop '表名'
4.3.9 獲取某個(gè)表賦值給一個(gè)變量 get_table
1.通過 var = get_table ‘表名’ 賦值給一個(gè)變量對象,然后對象.來調(diào)用,就像面向?qū)ο缶幊桃粯?,通過對象.方法來調(diào)用,這種方式在操作某個(gè)表時(shí)就不必每次列舉表名了。
4.3.10 獲取rowKey所在的區(qū) locate_region
4.3.11 顯示hbase所支持的所有過濾器show_filters
1.過濾器用于get和scan命令中作為篩選數(shù)據(jù)的條件,類型關(guān)系型數(shù)據(jù)庫中的where的作用
4.4 namespace
hbase中沒有數(shù)據(jù)庫的概念 , 可以使用namespace來達(dá)到數(shù)據(jù)庫分類別管理表的作用
4.4.1 列舉命名空間 list_namespace
4.4.2 獲取命名空間描述 describe_namespace
1.語法?describe_namespace '命名空間'
??
4.4.3 查看命名空間下的所有表 list_namespace_tables
4.4.4 創(chuàng)建命名空間create_namespace
4.4.5 刪除命名空間drop_namespace
4.5 DML
4.5.1 插入或者修改數(shù)據(jù)put
1.語法:
當(dāng)列族中只有一個(gè)列時(shí)'列族名:列名'使用'列族名' put '表名', '行鍵', '列族名', '列值' put '表名', '行鍵', '列族名:列名', '列值'
2.他寫入是一行寫入的
?
# 第一行數(shù)據(jù)
put 'users', 'rk1001', 'info:id', '1'
put 'users', 'rk1001', 'info:name', '張三'
put 'users', 'rk1001', 'info:age', '28'
put 'users', 'rk1001', 'detail:birthday', '1990-06-26'
put 'users', 'rk1001', 'detail:email', 'abc@163.com'
put 'users', 'rk1001', 'detail:create_time', '2019-03-04 14:26:10'
put 'users', 'rk1001', 'address', '上海市'
# 第二行數(shù)據(jù)
put 'users', 'rk1002', 'info:id', '2'
put 'users', 'rk1002', 'info:name', '李四'
put 'users', 'rk1002', 'info:age', '27'
put 'users', 'rk1002', 'detail:birthday', '1990-06-27'
put 'users', 'rk1002', 'detail:email', 'xxx@gmail.com'
put 'users', 'rk1002', 'detail:create_time', '2019-03-05 14:26:10'
put 'users', 'rk1002', 'address', '北京市'
# 第三行數(shù)據(jù)
put 'users', 'rk1003', 'info:id', '3'
put 'users', 'rk1003', 'info:name', '王五'
put 'users', 'rk1003', 'info:age', '26'
put 'users', 'rk1003', 'detail:birthday', '1990-06-28'
put 'users', 'rk1003', 'detail:email', 'xyz@qq.com'
put 'users', 'rk1003', 'detail:create_time', '2019-03-06 14:26:10'
put 'users', 'rk1003', 'address', '杭州市'
4.5.2 全表掃描scan
1.語法
scan '表名'
?2.掃描整個(gè)列簇
# 語法 scan '表名', {COLUMN=>'列族名'}
# 示例 scan 'users', {COLUMN=>'info'}
3.掃描整個(gè)列簇的某個(gè)列
# 語法 scan '表名', {COLUMN=>'列族名:列名'}
# 示例 scan 'users', {COLUMN=>'info:age'}
4.限制查幾行
語法
scan '表名',{LIMIT=>1}
意思是查一行
4.5.3 獲取數(shù)據(jù)get
1.可以獲取某一行,也可以獲取應(yīng)該單元格
# 語法 get '表名', '行鍵'
# 示例 get 'users', 'xiaoming'
2.建表的時(shí)候確定了幾個(gè)版本的值,那么獲取的時(shí)候頁可以獲取幾個(gè)版本的值
例如?create 'test1', {NAME => 'cf1', VERSIONS => 4} 建表語句
get '表名','行名',{COLUMN=>'列簇',VERSIONS=>4}
4.5.4 刪除某個(gè)列族中的某個(gè)列delete
1.語法 delete '表名', '行鍵', '列族名:列名'
2.刪除的是最新的那一列
4.5.5 刪除某行數(shù)據(jù)deleteall
1.語法?deleteall '表名', '行鍵'
?
4.5.6 清空整個(gè)表的數(shù)據(jù)truncate
1.語法?truncate '表名'
4.5.7 自增incr
1.語法 incr '表名', '行鍵', '列族:列名', 步長值
2. # 示例? # 注意:incr 可以對不存的行鍵操作,如果行鍵已經(jīng)存在會(huì)報(bào)錯(cuò),如果使用put修改了incr的值再使用incr也會(huì)報(bào)錯(cuò) # ERROR: org.apache.hadoop.hbase.DoNotRetryIOException: Field is not a long, it's 2 bytes wide incr 'tbl_user', 'xiaohong', 'info:age', 1
?
4.5.8 計(jì)數(shù)器get_counter
create 'counters', 'daily', 'weekly', 'monthly' incr 'counters', '20240415', 'daily:hits', 1 get_counter 'counters', '20240415', 'daily:hits'? 獲取計(jì)數(shù)器的值
4.5.9 修飾詞
1.修飾詞
# 語法 scan '表名', {COLUMNS => [ '列族名1:列名1', '列族名1:列名2', ...]}
# 示例 scan 'tbl_user', {COLUMNS => [ 'info:id', 'info:age']}
2.TIMESTAMP 指定時(shí)間戳
scan '表名',{TIMERANGE=>[timestamp1, timestamp2]}
# 示例 scan 'tbl_user',{TIMERANGE=>[1551938004321, 1551938036450]}
區(qū)間是左閉右開的
3.VERSIONS
默認(rèn)情況下一個(gè)列只能存儲(chǔ)一個(gè)數(shù)據(jù),后面如果修改數(shù)據(jù)就會(huì)將原來的覆蓋掉,可以通過指定VERSIONS時(shí)HBase一列能存儲(chǔ)多個(gè)值。
create 'tbl_test', 'columnFamily1'
describe 'tbl_test'
# 修改列族版本號
alter 'tbl_test', { NAME=>'columnFamily1', VERSIONS=>3 }
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value1'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value2'
put 'tbl_test', 'rowKey1', 'columnFamily1:column1', 'value3'
# 默認(rèn)返回最新的一條數(shù)據(jù)
get 'tbl_test','rowKey1','columnFamily1:column1'
# 返回3個(gè)
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>3}
# 返回2個(gè)
get 'tbl_test','rowKey1',{COLUMN=>'columnFamily1:column1', VERSIONS=>2}
4、STARTROW
ROWKEY起始行。會(huì)先根據(jù)這個(gè)key定位到region,再向后掃描
?
scan '表名', { STARTROW => '行鍵名'}
# 示例 scan 'users', { STARTROW => 'rk1002'}
5、STOPROW :截止到STOPROW行,STOPROW行之前的數(shù)據(jù),不包括STOPROW這行數(shù)據(jù)
# 語法 scan '表名', { STOPROW => '行鍵名'}
5.ENDROW :截止到ENDROW 行,ENDROW 行之前的數(shù)據(jù),不包括ENDROW 這行數(shù)據(jù)
scan '表名', {ENDROW => '行鍵名'}
?
6、LIMIT 返回的行數(shù)
# 語法 scan '表名', { LIMIT => 行數(shù)}
# 示例 scan 'tbl_user', { LIMIT => 2 }
4.5.10 FILTER條件過濾器
過濾器之間可以使用AND、OR連接多個(gè)過濾器。
1、ValueFilter 值過濾器
# 語法:binary 等于某個(gè)值 scan '表名', FILTER=>"ValueFilter(=,'binary:列值')"
scan 'users',FILTER=>"ValueFilter(=,'binary:張三')"
取出張三的所有信息
# 語法 substring:包含某個(gè)值 scan '表名', FILTER=>"ValueFilter(=,'substring:列值')"
scan 'users',FILTER=>"ValueFilter(=,'substring:2019')"
取里面包含2019的所有列
?
2、ColumnPrefixFilter 列名前綴過濾器
# 語法 substring:包含某個(gè)值 scan '表名', FILTER=>"ColumnPrefixFilter('列名前綴')"
scan 'users', FILTER=>"ColumnPrefixFilter('a')"
取出所有包含a的列的所有信息
?
3、rowKey字典排序
Table中的所有行都是按照row key的字典排序的
柚子快報(bào)激活碼778899分享:數(shù)據(jù)庫 Hbase的簡單學(xué)習(xí)一
好文閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。