新聞中心
HDFS 為 Hbase 提供了可靠的底層數(shù)據(jù)存儲服務,Zookeeper 為 Hbase 元數(shù)據(jù)管理和協(xié)調(diào)服務,Hbase 是一個通過大量廉價的機器解決海量數(shù)據(jù)的高速存儲和讀取的分布式數(shù)據(jù)庫解決方案。HBase 的原型是谷歌的分布式存儲系統(tǒng) BigTable,是谷歌 BigTable 的開源實現(xiàn)。

創(chuàng)新互聯(lián)建站專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、汕城網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5技術、商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設公司、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為汕城等各大城市提供網(wǎng)站開發(fā)制作服務。
- Table:表,一個表包含多行數(shù)據(jù)。
- Rowkey:行的主鍵,唯一標識一行數(shù)據(jù),用于檢索記錄。
- Column family:列簇,同一個列簇的所有成員具有相同的列簇前綴,通常將同一類型的列存放在一個列簇下。
- Qualifier:列,以列簇作為前綴,格式為 Column family:Qualifier。
- Timestamp:時間戳,插入單元格時的時間戳,默認作為單元格的版本號。不同版本的數(shù)據(jù)按照時間戳倒序排序,即最新的數(shù)據(jù)排在最前面。
- Cell:單元格,在 HBase 中,值作為一個單元保存在單元格中。要定位一個單元,需要滿足 “rowkey + column family + qualifier + timestamp” 四個要素。每個 cell 保存著同一份數(shù)據(jù)的多個版本。cell 中沒有數(shù)據(jù)類型,完全是字節(jié)存儲。
- Master:主要負責 HBase 系統(tǒng)的各種管理工作:
- 處理用戶的各種管理請求,包括建表、修改表、權限操作、切分表、合并數(shù)據(jù)分片以及 Compaction 等。
- 管理集群中所有 RegionServer,包括 RegionServe r中 Region 的負載均衡、RegionServer 的宕機恢復以及 Region 的遷移等。
- 清理過期日志以及文件,Master 會每隔一段時間檢查 HDFS 中 HLog 是否過期、HFile 是否已經(jīng)被刪除,并在過期之后將其刪除。
- RegionServer:RegionServer 主要用來響應用戶的 IO 請求,是 HBase 中最核心的模塊,由 WAL(HLog)、BlockCache 以及多個 Region 構成。
- Store:由兩部分組成:MemStore 和 StoreFile。MemStore 稱為寫緩存,用戶寫入數(shù)據(jù)時首先會寫到 MemStore,當 MemStore 寫滿之后(緩存數(shù)據(jù)超過閾值,默認 128M)系統(tǒng)會異步地將數(shù)據(jù) flush成一個 HFile 文件。顯然,隨著數(shù)據(jù)不斷寫入,HFile 文件會越來越多,當 HFile 文件數(shù)超過一定閾值之后系統(tǒng)將會執(zhí)行 Compact 操作,將這些小文件通過一定策略合并成一個或多個大文件。
- StoreFile(HFile):HBase 的數(shù)據(jù)最終是存放在 HDFS 上的,StoreFile 在 HDFS 上稱為 HFile。
Region:數(shù)據(jù)表的一個分片,當數(shù)據(jù)表大小超過一定閾值就會“水平切分”,Region 是集群負載均衡的基本單位。一個 Region 由一個或者多個 Store 構成, Store 的個數(shù)取決于表中列簇(column family)的個數(shù),有多少個列簇就有多少個 Store。
- HLog:Write ahead log(WAL),HLog 在 HBase 中有兩個核心作用:其一,用于實現(xiàn)數(shù)據(jù)的高可靠性,HBase 數(shù)據(jù)隨機寫入時,并非直接寫入 HFile 數(shù)據(jù)文件,而是先寫入緩存,再異步刷新落盤。為了防止緩存數(shù)據(jù)丟失,數(shù)據(jù)寫入緩存之前需要首先順序?qū)懭?HLog,這樣,即使緩存數(shù)據(jù)丟失,仍然可以通過 HLog 日志恢復;其二,用于實現(xiàn) HBase 集群間主從復制,通過回放主集群推送過來的 HLog 日志實現(xiàn)主從復制。
- BlockCache:HBase系統(tǒng)中的讀緩存??蛻舳藦拇疟P讀取數(shù)據(jù)之后通常會將數(shù)據(jù)緩存到系統(tǒng)內(nèi)存中,后續(xù)訪問同一行數(shù)據(jù)可以直接從內(nèi)存中獲取而不需要訪問磁盤。
- HBase 客戶端:提供了 Shell 命令行接口、原生 Java API 編程接口、Thrift/REST API 編程接口以及 MapReduce 編程接口。
整體示意圖:
邏輯視圖
從邏輯視圖來看,HBase 中的數(shù)據(jù)是以表形式進行組織的,而且和關系型數(shù)據(jù)庫中的表一樣,HBase 中的表也由行和列構成。
在下圖中有兩個列簇:Personal 和 Office,Personal 列簇中存放了和個人信息相關的三個列:name,age,phone。Office 列簇中存放了和辦公地點相關的兩個列:zip,address。rowkey 為 00008 的 personal:phone 的 cell 存放了兩個版本的數(shù)據(jù)。
HBase 將數(shù)據(jù)按照 rowkey 字典序排序存儲,訪問 Hbase 表有三種方式:
- 1.通過單個row key訪問
- 2.通過row key的range
- 3.全表掃描
物理視圖
從物理視圖來看,HBase 是一個 Map,由鍵值 KV 構成,不過與普通的 Map 不同,HBase 是一個稀疏的、分布式的、多維排序的 Map。HBase 中 Map 的 key 是一個復合鍵,由 rowkey、column family、qualifier 以及 timestamp 組成,value 即為 cell 的值。
稀疏性是 HBase 中的一個突出的特點,在其他數(shù)據(jù)庫中,對于空值的處理一般都會填充 null,對于成百上千萬列的表來說,通常會存在大量的空值,如果使用填充 null 的策略,勢必會造成大量空間的浪費。而對于 HBase 空值不需要任何填充,因此稀疏性是 HBase 的列可以無限擴展的一個重要的條件。
與大多數(shù)數(shù)據(jù)庫系統(tǒng)不同,HBase 中的數(shù)據(jù)是按照列簇存儲的,即將數(shù)據(jù)按照列簇分別存儲在不同的目錄中。為什么 HBase 要將數(shù)據(jù)按照列簇分別存儲?回答這個問題之前需要先了解兩個非常常見的概念:行式存儲、列式存儲,這是數(shù)據(jù)存儲領域比較常見的兩種數(shù)據(jù)存儲方式。
行式存儲:行式存儲系統(tǒng)會將一行數(shù)據(jù)存儲在一起,一行數(shù)據(jù)寫完之后再接著寫下一行,最典型的如 MySQL 這類關系型數(shù)據(jù)庫。
行式存儲在獲取一行數(shù)據(jù)時是很高效的,但是如果某個查詢只需要讀取表中指定列對應的數(shù)據(jù),那么行式存儲會先取出一行行數(shù)據(jù),再在每一行數(shù)據(jù)中截取待查找目標列。這種處理方式在查找過程中引入了大量無用列信息,從而導致大量內(nèi)存占用。因此,這類系統(tǒng)僅適合于處理OLTP 類型的負載,對于 OLAP 這類分析型負載并不擅長。
列式存儲:列式存儲理論上會將一列數(shù)據(jù)存儲在一起,不同列的數(shù)據(jù)分別集中存儲,最典型的如Kudu、Parquet on HDFS 等系統(tǒng)。
列式存儲對于只查找某些列數(shù)據(jù)的請求非常高效,只需要連續(xù)讀出所有待查目標列,然后遍歷處理即可;但是反過來,列式存儲對于獲取一行的請求就不那么高效了,需要多次 IO 讀多個列數(shù)據(jù),最終合并得到一行數(shù)據(jù)。另外,因為同一列的數(shù)據(jù)通常都具有相同的數(shù)據(jù)類型,因此列式存儲具有天然的高壓縮特性。
列簇式存儲:從概念上來說,列簇式存儲介于行式存儲和列式存儲之間,可以通過不同的設計思路在行式存儲和列式存儲兩者之間相互切換。比如,一張表只設置一個列簇,這個列簇包含所有用戶的列。HBase 中一個列簇的數(shù)據(jù)是存儲在一起的,因此這種設計模式就等同于行式存儲。再比如,一張表設置大量列簇,每個列簇下僅有一列,很顯然這種設計模式就等同于列式存儲。上面兩例當然是兩種極端的情況,在當前體系中不建議設置太多列簇,但是這種架構為HBase將來演變成 HTAP(Hybrid Transactional and Analytical Processing)系統(tǒng)提供了最核心的基礎。
- HBase 是典型的 Master-Slave 模型,系統(tǒng)中有一個管理集群的 Master 節(jié)點以及大量實際服務用戶讀寫的 RegionServer 節(jié)點。
- HBase 中所有數(shù)據(jù)最終都存儲在 HDFS 系統(tǒng)中,為數(shù)據(jù)提供了高可靠的保障。
- Zookeeper 節(jié)點為 HBase 集群提供了協(xié)調(diào)管理的作用。
- 實現(xiàn) Master 高可用:通常情況下系統(tǒng)中只有一個 Master 工作,一旦 ActiveMaster 由于異常宕機,ZooKeeper 會檢測到該宕機事件,并通過一定機制選舉出新的 Master,保證系統(tǒng)正常運轉(zhuǎn)。
- 管理系統(tǒng)核心元數(shù)據(jù):比如,管理當前系統(tǒng)中正常工作的 RegionServer 集合,保存系統(tǒng)元數(shù)據(jù)表 hbase:meta 所在的 RegionServer 地址等。
- 參與 RegionServer 宕機恢復:ZooKeeper 通過心跳可以感知到 RegionServer 是否宕機,并在宕機后通知 Master 進行宕機處理。
- 實現(xiàn)分布式表鎖:HBase 中對一張表進行各種管理操作(比如 alter 操作)需要先加表鎖,防止其他用戶對同一張表進行管理操作,造成表狀態(tài)不一致。和其他 RDBMS 表不同,HBase 中的表通常都是分布式存儲,ZooKeeper 可以通過特定機制實現(xiàn)分布式表鎖。
Client 在讀寫數(shù)據(jù)的過程中,不會和 Master 節(jié)點進行交互,當處理管理請求時:包括建表、修改表、權限操作、切分表、合并數(shù)據(jù)分片以及 Compaction 等,才會和 Master 節(jié)點通信。
寫流程
- 1.Client 先訪問 Zookeeper 的 /hbase/meta-region-server 節(jié)點,獲取 hbase:meta 表位于哪個 RegionServer。
- 2.Client 訪問對應的 RegionServer,獲取 hbase:meta 表,將 hbase:meta 表信息緩存在客戶端的 MetaCache,方便下次訪問。從 hbase:meta 表中找到相應 rowkey 需要訪問的 RegionServer。
- 3.Client 的 Put 操作會將數(shù)據(jù)先寫入 HLog(WAL)。
- 4.當數(shù)據(jù)寫入 HLog 后,再將數(shù)據(jù)寫入 MemStore(內(nèi)存),數(shù)據(jù)會在 MemStore 進行排序。
- 5.一旦數(shù)據(jù)成功寫入到 MemStore,Client 將收到 ACK。
- 6.當 MemStore 中的數(shù)據(jù)達到閾值,數(shù)據(jù)會刷寫入 HFile(磁盤)。
HBase 服務端并沒有提供 update、delete 接口,HBase 中隊數(shù)據(jù)的更新、刪除操作在服務端也認為是寫入操作,不同的是,更新操作會寫入一個最新版本的數(shù)據(jù),刪除操作會寫入一條標記為 deleted 的 KV 數(shù)據(jù)。
MemStore Flush 觸發(fā)條件:
- MemStore 級別限制:當 Region 中任意一個 MemStore 大小達到上限(默認是 128M),觸發(fā) MemStore 刷新。
- Region 級別限制:當 Region 中所有 MemStore 大小總和達到了上限,會觸發(fā) MemStore 刷新。
- RegionServer 級別限制:當 RegionServer 中 MemStore 的大小總和超過低水位閾值,RegionServer 開始強制執(zhí)行 flush,先 flush MemStore 最大的 Region,再 flush 次大的,依次執(zhí)行。如果此時的寫入吞吐量依然很高,導致總 MemStore 大小超過高水位閾值,RegionServer 會阻塞更新并強制執(zhí)行 flush,直至總 MemStore 大小降到低水位閾值。
- 當一個 RegionServer 的 HLog 數(shù)量達到上限,系統(tǒng)會選取最早的 HLog 對應的一個或多個 Region 進行 flush。
- HBase 定期 1 小時刷新 MemStore。
- 手動執(zhí)行 flush:用戶可以通過 shell 命令 flush 'tablename' 或者 flush 'regionname' 分別對一個表或者一個 Region 進行 flush。
HBase 系統(tǒng)內(nèi)部設計了一張?zhí)厥獾谋?— hbase:meta 表,專門用來存放整個集群所有的 Region 信息,該表存放在 Zookeeper 中。hbase:meta 中的 hbase 指的是 namespace,HBase 允許針對不同的業(yè)務設計不同的 namespace,系統(tǒng)表采用統(tǒng)一的 namespace,即 hbase;meta 指的是 hbase 這個 namespace 下的表名。
讀流程
- 1、2.前兩步和寫入流程相同,如果本地沒有 hbase:meta 表的緩存或者根據(jù)緩存沒有在 RegionServer 上查到數(shù)據(jù),那么會去請求 Zookeeper。
- 3.分別在 BlockCache(讀緩存),MemStore 和 StoreFile(HFile)中查詢目標數(shù)據(jù),并將查到的所有數(shù)據(jù)進行合并。數(shù)據(jù)合并指的同一條數(shù)據(jù)的不同版本(timestamp)或者不同的類型(put/delete)。
- 4.將從文件中查詢到的數(shù)據(jù)塊(Block,HFile 數(shù)據(jù)存儲單元,默認大小為 64KB)緩存到 BlockCache。
- 5.將合并后的最終結(jié)果返回給客戶端。
Hbase 的一個列簇(Column Family)本質(zhì)上就是一顆 LSM 樹(Log-Structured Merge Tree),
LSM 樹分為內(nèi)存部分和磁盤部分。內(nèi)存部分是一個維護有序數(shù)據(jù)集合的數(shù)據(jù)結(jié)構。一般來講,內(nèi)存數(shù)據(jù)結(jié)構可以選擇平衡二叉樹、紅黑樹、跳躍表(SkipList) 等維護有序集的數(shù)據(jù)結(jié)構。這里由于考慮到并發(fā)性能,HBase 選擇了表現(xiàn)更優(yōu)秀的跳躍表。磁盤部分是由一個個獨立的文件組成,每一個文件又是由一個個數(shù)據(jù)塊組成。
LSM 樹的索引結(jié)構本質(zhì)是將寫入操作全部轉(zhuǎn)化成磁盤的順序?qū)懭?,極大地提高了寫入操作的性能。
HBase 的 MemStore 在滿足閾值的情況下會將內(nèi)存中的數(shù)據(jù)刷寫成 HFile,一個 MemStore 刷寫就會形成一個 Hfile。隨著時間的推移,同一個 Store 下的 HFile 會越來越多,文件太多會影響 HBase 查詢性能,主要體現(xiàn)在查詢數(shù)據(jù)的 IO 次數(shù)增加。為了優(yōu)化查詢性能,HBase 會合并小的 HFile 以減少文件數(shù)量,這種合并 HFile 的操作稱為 Compaction。
- Minor Compaction:會將鄰近的若干個 HFile 合并,在合并過程中會清理 TTL 的數(shù)據(jù),但不會清理被刪除的數(shù)據(jù)。Minor Compaction 消耗的資源較少,通過少量的 IO 減少文件的個數(shù),提升讀取操作的性能,適合高頻率地跑。
- Major Compaction:會將一個 Store 下的所有 HFile 進行合并,并且會清理掉過期的和被刪除的數(shù)據(jù),即在 Major Compaction 會刪除全部需要刪除的數(shù)據(jù)。一般情況下,Major Compaction 時間會持續(xù)比較長,整個過程會消耗大量系統(tǒng)資源,對上層業(yè)務有比較大的影響。因此,生產(chǎn)環(huán)境下通常關閉自動觸發(fā) Major Compaction 功能,改為手動在業(yè)務低峰期觸發(fā)。
安裝前提
- ??部署 Zookeeper 集群??。
- ??部署好 HDFS 集群??。
節(jié)點規(guī)劃
|
主機名 |
IP地址 |
角色 |
|
hadoop1 |
192.168.1.117 |
Master,RegionServer |
|
hadoop2 |
192.168.1.117 |
Backup Master,RegionServer |
|
hadoop3 |
192.168.1.117 |
Backup Master,RegionServer |
Hosts 配置
編輯 /etc/hosts 文件,添加以下內(nèi)容,3 臺機器都要配置:
192.168.1.117 hadoop1
192.168.1.118 hadoop2
192.168.1.119 hadoop3
下載安裝包
wget https://www.apache.org/dyn/closer.lua/hbase/2.4.4/hbase-2.4.4-bin.tar.gz
tar -xzvf hbase-2.4.4-bin.tar.gz
mv hbase-2.4.4 /software/hbase
配置環(huán)境變量
添加環(huán)境變量,修改 /etc/profile,添加以下兩行:
export HBASE_HOME=/software/hbase
export PATH=$PATH:$HBASE_HOME/bin
保存退出后,使用下面命令使環(huán)境變量生效:
source /etc/profile
修改配置文件
編輯 conf/hbase-env.sh:
#配置JAVA_HOME
export JAVA_HOME=/software/jdk
#使用的外置的 zookeeper
export HBASE_MANAGES_ZK=
編輯 conf/hbase-site.xml:
//設置將數(shù)據(jù)寫入hdfs的目錄
hbase.rootdir
hdfs://hadoop1:8020/hbase
//設置hbase模式為集群模式
hbase.cluster.distributed
true
//設置zookeeper的連接地址
hbase.zookeeper.quorum
hadoop1,hadoop2,hadoop3
編輯 conf/regionservers,配置 RegionServer 地址:
hadoop1
hadoop2
hadoop3
編輯 conf/backup-masters,配置 Backup Master 地址:
hadoop2
hadoop3
復制 hadoop1 中的 hbase 文件夾到 hadoop2、hadoop3 中,在hadoop1 中執(zhí)行如下命令:
scp -r /software/hbase hadoop2:/software/
scp -r /software/hbase hadoop3:/software/
復制 hadoop1中的 /etc/profile 到 hadoop2、hadoop3 中,然后在hadoop2、hadoop3 上執(zhí)行 source /etc/profile。
scp /etc/profile hadoop2:/etc/
scp /etc/profile hadoop3:/etc/
啟動 Hbase 集群
在 Hadoop1 節(jié)點上啟動 Hbase 集群:
start-hbase.sh
瀏覽器輸入 http://hadoop1:16010 訪問 Hbase WebUI 界面。可以看到我們運行了 3 個 RegionServer,Hadoop1 是 HMaster,Hadoop2 和 Hadoop3 是 Backup Master。
高可用測試
在 Hadoop1 上 kill 掉 HMaster 進程。
此時 HMaster 節(jié)點變?yōu)?Hadoop3。
測試完畢后重新在 Hadoop1 上啟動 Hbase。
連接 Hbase:
hbase shell
查看節(jié)點相關信息
hbase:001:0> zk_dump
HBase is rooted at /hbase
Active master address: hadoop3,16000,1627304946697
Backup master addresses:
hadoop2,16000,1627304947104
hadoop1,16000,1627305210616
Region server holding hbase:meta: hadoop2,16020,1627304944927
Region servers:
hadoop1,16020,1627304944998
hadoop2,16020,1627304944927
hadoop3,16020,1627304944853
Quorum Server Statistics:
hadoop1:2181
stat is not executed because it is not the whitelist.
hadoop2:2181
stat is not executed because it is not the whitelist.
hadoop3:2181
stat is not executed because it is not the whitelist.
Took 0.2593 seconds
創(chuàng)建命名空間
hbase:007:0> create_namespace 'chengzw'
Took 0.1970 seconds
列出命名空間
hbase:020:0> list_namespace
NAMESPACE
chengzw #剛剛創(chuàng)建的命名空間
default
hbase
school
4 row(s)
Took 0.0150 seconds
創(chuàng)建表
在 chengzw 命名空間內(nèi)創(chuàng)建 student 表,一張表的所有 row 按照 rowkey 的字典序由小到大排序,rowkey 為 name,有 2 個列簇 info,score,表結(jié)構如下所示:
使用以下命令創(chuàng)建表:
hbase:003:0> create 'chengzw:student','info','score'
Created table chengzw:student
Took 0.6718 seconds
=> Hbase::Table - chengzw:student
判斷表是否存在
hbase:012:0> exists 'chengzw:student'
Table chengzw:student does exist
Took 0.0230 seconds
=>
列出表
hbase:023:0> list
TABLE
chengzw:student #剛剛創(chuàng)建的表
kylin_metadata
member
new_help_keyword
student
5 row(s)
Took 0.0109 seconds
=> ["chengzw:student", "kylin_metadata", "member", "new_help_keyword", "student"]
查看表結(jié)構
hbase:005:0> describe 'chengzw:student'
Table chengzw:student is ENABLED
chengzw:student
COLUMN FAMILIES DESCRIPTION
{NAME => 'info', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESSI
ON => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
{NAME => 'score', BLOOMFILTER => 'ROW', IN_MEMORY => 'false', VERSIONS => '1', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', COMPRESS
ION => 'NONE', TTL => 'FOREVER', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
2 row(s)
Quota is disabled
Took 0.0654 seconds
插入數(shù)據(jù)
插入 5 行數(shù)據(jù),put 后面從左往右依次有 4 個參數(shù):
- 1.表名
- 2.rowkey
- 3.列名,使用?
?Column Family:Qualifier?? 表示。 - 4.值
put 'chengzw:student','Tom','info:student_id','20210000000001'
put 'chengzw:student','Tom','info:class',1
put 'chengzw:student','Tom','score:understanding',75
put 'chengzw:student','Tom','score:programming',82
put 'chengzw:student','Jerry','info:student_id','20210000000002'
put 'chengzw:student','Jerry','info:class',1
put 'chengzw:student','Jerry','score:understanding',85
put 'chengzw:student','Jerry','score:programming',67
put 'chengzw:student','Jack','info:student_id','20210000000003'
put 'chengzw:student','Jack','info:class',2
put 'chengzw:student','Jack','score:understanding',80
put 'chengzw:student','Jack','score:programming',80
put 'chengzw:student','Rose','info:student_id','20210000000004'
put 'chengzw:student','Rose','info:class',2
put 'chengzw:student','Rose','score:understanding',60
put 'chengzw:student','Rose','score:programming',61
put 'chengzw:student','程治瑋','info:student_id','G20210735010497'
put 'chengzw:student','程治瑋','info:class',5
put 'chengzw:student','程治瑋','score:understanding',100
put 'chengzw:student','程治瑋','score:programming',100
掃描表查看數(shù)據(jù)
默認情況下,通過 hbase shell 的 scan 或 get 等命令獲取的中文內(nèi)容都是 16 進制的,無法直觀的查看數(shù)據(jù)。通過 ??{FORMATTER => 'toString'}?? 可以將 16 進制中文轉(zhuǎn)換成 utf-8 格式的中文的。
獲取全表數(shù)據(jù):
hbase:093:0> scan 'chengzw:student',{FORMATTER => 'toString'}
ROW COLUMN+CELL
Jack column=info:class, timestamp=2021-07-31T12:16:10.469, value=2
Jack column=info:student_id, timestamp=2021-07-31T12:16:10.442, value=20210000000003
Jack column=score:programming, timestamp=2021-07-31T12:16:10.532, value=80
Jack column=score:understanding, timestamp=2021-07-31T12:16:10.510, value=80
Jerry column=info:class, timestamp=2021-07-31T12:16:10.362, value=1
Jerry column=info:student_id, timestamp=2021-07-31T12:16:10.338, value=20210000000002
Jerry column=score:programming, timestamp=2021-07-31T12:16:10.409, value=67
Jerry column=score:understanding, timestamp=2021-07-31T12:16:10.387, value=85
Rose column=info:class, timestamp=2021-07-31T12:16:10.587, value=2
Rose column=info:student_id, timestamp=2021-07-31T12:16:10.565, value=20210000000004
Rose column=score:programming, timestamp=2021-07-31T12:16:10.632, value=61
Rose column=score:understanding, timestamp=2021-07-31T12:16:10.609, value=60
Tom column=info:class, timestamp=2021-07-31T12:16:10.203, value=1
Tom column=info:student_id, timestamp=2021-07-31T12:16:10.175, value=20210000000001
Tom column=score:programming, timestamp=2021-07-31T12:16:10.298, value=82
Tom column=score:understanding, timestamp=2021-07-31T12:16:10.243, value=75
程治瑋 column=info:class, timestamp=2021-07-31T12:16:10.685, value=5
程治瑋 column=info:student_id, timestamp=2021-07-31T12:16:10.663, value=G20210735010497
程治瑋 column=score:programming, timestamp=2021-07-31T12:16:11.518, value=100
程治瑋 column=score:understanding, timestamp=2021-07-31T12:16:10.707, value=100
5 row(s)
Took 0.0378 seconds
掃描 rowkey 從 Jack 到 Rose 中的行,這是左閉右開的區(qū)間,返回的結(jié)果包括 Jack,不包括 Rose:
hbase:094:0> scan 'chengzw:student',{STARTROW => 'Jack',STOPROW => 'Rose'}
ROW COLUMN+CELL
Jack column=info:class, timestamp=2021-07-31T12:16:10.469, value=2
Jack column=info:student_id, timestamp=2021-07-31T12:16:10.442, value=20210000000003
Jack column=score:programming, timestamp=2021-07-31T12:16:10.532, value=80
Jack column=score:understanding, timestamp=2021-07-31T12:16:10.510, value=80
Jerry column=info:class, timestamp=2021-07-31T12:16:10.362, value=1
Jerry column=info:student_id, timestamp=2021-07-31T12:16:10.338, value=20210000000002
Jerry column=score:programming, timestamp=2021-07-31T12:16:10.409, value=67
Jerry column=score:understanding, timestamp=2021-07-31T12:16:10.387, value=85
2 row(s)
Took 0.0188 seconds
掃描到 rowkey 為 Tom 的行,獲取 score 和 info:student_id 的值,返回的結(jié)果不包括 Tom 這一行:
hbase:101:0> scan 'chengzw:student',{COLUMNS => ['score','info:student_id'],STOPROW => 'Tom'}
ROW COLUMN+CELL
Jack column=info:student_id, timestamp=2021-07-31T12:16:10.442, value=20210000000003
Jack column=score:programming, timestamp=2021-07-31T12:16:10.532, value=80
Jack column=score:understanding, timestamp=2021-07-31T12:16:10.510, value=80
Jerry column=info:student_id, timestamp=2021-07-31T12:16:10.338, value=20210000000002
Jerry column=score:programming, timestamp=2021-07-31T12:16:10.409, value=67
Jerry column=score:understanding, timestamp=2021-07-31T12:16:10.387, value=85
Rose column=info:student_id, timestamp=2021-07-31T12:16:10.565, value=20210000000004
Rose column=score:programming, timestamp=2021-07-31T12:16:10.632, value=61
Rose column=score:understanding, timestamp=2021-07-31T12:16:10.609, value=60
3 row(s)
Took 0.0175 seconds
獲取 info:student_id 這列的數(shù)據(jù):
hbase:100:0> scan 'chengzw:student', {COLUMNS => 'info:student_id',FORMATTER => 'toString'}
ROW COLUMN+CELL
Jack column=info:student_id, timestamp=2021-07-31T12:16:10.442, value=20210000000003
Jerry column=info:student_id, timestamp=2021-07-31T12:16:10.338, value=20210000000002
Rose column=info:student_id, timestamp=2021-07-31T12:16:10.565, value=20210000000004
Tom column=info:student_id, timestamp=2021-07-31T12:16:10.175, value=20210000000001
程治瑋 column=info:student_id, timestamp=2021-07-31T12:16:10.663, value=G20210735010497
5 row(s)
Took 0.0112 seconds
獲取數(shù)據(jù)
獲取 rowkey 為 Tom 的行:
hbase:105:0> get
網(wǎng)頁標題:萬字干貨,分布式數(shù)據(jù)庫HBase中文入門指南
轉(zhuǎn)載來源:http://m.5511xx.com/article/cdspidc.html


咨詢
建站咨詢
