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