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

創(chuàng)新互聯(lián)建站專注于企業(yè)營(yíng)銷型網(wǎng)站、網(wǎng)站重做改版、汕城網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)、商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為汕城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
- Table:表,一個(gè)表包含多行數(shù)據(jù)。
- Rowkey:行的主鍵,唯一標(biāo)識(shí)一行數(shù)據(jù),用于檢索記錄。
- Column family:列簇,同一個(gè)列簇的所有成員具有相同的列簇前綴,通常將同一類型的列存放在一個(gè)列簇下。
- Qualifier:列,以列簇作為前綴,格式為 Column family:Qualifier。
- Timestamp:時(shí)間戳,插入單元格時(shí)的時(shí)間戳,默認(rèn)作為單元格的版本號(hào)。不同版本的數(shù)據(jù)按照時(shí)間戳倒序排序,即最新的數(shù)據(jù)排在最前面。
- Cell:?jiǎn)卧?,?HBase 中,值作為一個(gè)單元保存在單元格中。要定位一個(gè)單元,需要滿足 “rowkey + column family + qualifier + timestamp” 四個(gè)要素。每個(gè) cell 保存著同一份數(shù)據(jù)的多個(gè)版本。cell 中沒有數(shù)據(jù)類型,完全是字節(jié)存儲(chǔ)。
- Master:主要負(fù)責(zé) HBase 系統(tǒng)的各種管理工作:
- 處理用戶的各種管理請(qǐng)求,包括建表、修改表、權(quán)限操作、切分表、合并數(shù)據(jù)分片以及 Compaction 等。
- 管理集群中所有 RegionServer,包括 RegionServe r中 Region 的負(fù)載均衡、RegionServer 的宕機(jī)恢復(fù)以及 Region 的遷移等。
- 清理過期日志以及文件,Master 會(huì)每隔一段時(shí)間檢查 HDFS 中 HLog 是否過期、HFile 是否已經(jīng)被刪除,并在過期之后將其刪除。
- RegionServer:RegionServer 主要用來響應(yīng)用戶的 IO 請(qǐng)求,是 HBase 中最核心的模塊,由 WAL(HLog)、BlockCache 以及多個(gè) Region 構(gòu)成。
- Store:由兩部分組成:MemStore 和 StoreFile。MemStore 稱為寫緩存,用戶寫入數(shù)據(jù)時(shí)首先會(huì)寫到 MemStore,當(dāng) MemStore 寫滿之后(緩存數(shù)據(jù)超過閾值,默認(rèn) 128M)系統(tǒng)會(huì)異步地將數(shù)據(jù) flush成一個(gè) HFile 文件。顯然,隨著數(shù)據(jù)不斷寫入,HFile 文件會(huì)越來越多,當(dāng) HFile 文件數(shù)超過一定閾值之后系統(tǒng)將會(huì)執(zhí)行 Compact 操作,將這些小文件通過一定策略合并成一個(gè)或多個(gè)大文件。
- StoreFile(HFile):HBase 的數(shù)據(jù)最終是存放在 HDFS 上的,StoreFile 在 HDFS 上稱為 HFile。
Region:數(shù)據(jù)表的一個(gè)分片,當(dāng)數(shù)據(jù)表大小超過一定閾值就會(huì)“水平切分”,Region 是集群負(fù)載均衡的基本單位。一個(gè) Region 由一個(gè)或者多個(gè) Store 構(gòu)成, Store 的個(gè)數(shù)取決于表中列簇(column family)的個(gè)數(shù),有多少個(gè)列簇就有多少個(gè) Store。
- HLog:Write ahead log(WAL),HLog 在 HBase 中有兩個(gè)核心作用:其一,用于實(shí)現(xiàn)數(shù)據(jù)的高可靠性,HBase 數(shù)據(jù)隨機(jī)寫入時(shí),并非直接寫入 HFile 數(shù)據(jù)文件,而是先寫入緩存,再異步刷新落盤。為了防止緩存數(shù)據(jù)丟失,數(shù)據(jù)寫入緩存之前需要首先順序?qū)懭?HLog,這樣,即使緩存數(shù)據(jù)丟失,仍然可以通過 HLog 日志恢復(fù);其二,用于實(shí)現(xiàn) HBase 集群間主從復(fù)制,通過回放主集群推送過來的 HLog 日志實(shí)現(xiàn)主從復(fù)制。
- BlockCache:HBase系統(tǒng)中的讀緩存??蛻舳藦拇疟P讀取數(shù)據(jù)之后通常會(huì)將數(shù)據(jù)緩存到系統(tǒng)內(nèi)存中,后續(xù)訪問同一行數(shù)據(jù)可以直接從內(nèi)存中獲取而不需要訪問磁盤。
- HBase 客戶端:提供了 Shell 命令行接口、原生 Java API 編程接口、Thrift/REST API 編程接口以及 MapReduce 編程接口。
整體示意圖:
邏輯視圖
從邏輯視圖來看,HBase 中的數(shù)據(jù)是以表形式進(jìn)行組織的,而且和關(guān)系型數(shù)據(jù)庫(kù)中的表一樣,HBase 中的表也由行和列構(gòu)成。
在下圖中有兩個(gè)列簇:Personal 和 Office,Personal 列簇中存放了和個(gè)人信息相關(guān)的三個(gè)列:name,age,phone。Office 列簇中存放了和辦公地點(diǎn)相關(guān)的兩個(gè)列:zip,address。rowkey 為 00008 的 personal:phone 的 cell 存放了兩個(gè)版本的數(shù)據(jù)。
HBase 將數(shù)據(jù)按照 rowkey 字典序排序存儲(chǔ),訪問 Hbase 表有三種方式:
- 1.通過單個(gè)row key訪問
- 2.通過row key的range
- 3.全表掃描
物理視圖
從物理視圖來看,HBase 是一個(gè) Map,由鍵值 KV 構(gòu)成,不過與普通的 Map 不同,HBase 是一個(gè)稀疏的、分布式的、多維排序的 Map。HBase 中 Map 的 key 是一個(gè)復(fù)合鍵,由 rowkey、column family、qualifier 以及 timestamp 組成,value 即為 cell 的值。
稀疏性是 HBase 中的一個(gè)突出的特點(diǎn),在其他數(shù)據(jù)庫(kù)中,對(duì)于空值的處理一般都會(huì)填充 null,對(duì)于成百上千萬列的表來說,通常會(huì)存在大量的空值,如果使用填充 null 的策略,勢(shì)必會(huì)造成大量空間的浪費(fèi)。而對(duì)于 HBase 空值不需要任何填充,因此稀疏性是 HBase 的列可以無限擴(kuò)展的一個(gè)重要的條件。
與大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)不同,HBase 中的數(shù)據(jù)是按照列簇存儲(chǔ)的,即將數(shù)據(jù)按照列簇分別存儲(chǔ)在不同的目錄中。為什么 HBase 要將數(shù)據(jù)按照列簇分別存儲(chǔ)?回答這個(gè)問題之前需要先了解兩個(gè)非常常見的概念:行式存儲(chǔ)、列式存儲(chǔ),這是數(shù)據(jù)存儲(chǔ)領(lǐng)域比較常見的兩種數(shù)據(jù)存儲(chǔ)方式。
行式存儲(chǔ):行式存儲(chǔ)系統(tǒng)會(huì)將一行數(shù)據(jù)存儲(chǔ)在一起,一行數(shù)據(jù)寫完之后再接著寫下一行,最典型的如 MySQL 這類關(guān)系型數(shù)據(jù)庫(kù)。
行式存儲(chǔ)在獲取一行數(shù)據(jù)時(shí)是很高效的,但是如果某個(gè)查詢只需要讀取表中指定列對(duì)應(yīng)的數(shù)據(jù),那么行式存儲(chǔ)會(huì)先取出一行行數(shù)據(jù),再在每一行數(shù)據(jù)中截取待查找目標(biāo)列。這種處理方式在查找過程中引入了大量無用列信息,從而導(dǎo)致大量?jī)?nèi)存占用。因此,這類系統(tǒng)僅適合于處理OLTP 類型的負(fù)載,對(duì)于 OLAP 這類分析型負(fù)載并不擅長(zhǎng)。
列式存儲(chǔ):列式存儲(chǔ)理論上會(huì)將一列數(shù)據(jù)存儲(chǔ)在一起,不同列的數(shù)據(jù)分別集中存儲(chǔ),最典型的如Kudu、Parquet on HDFS 等系統(tǒng)。
列式存儲(chǔ)對(duì)于只查找某些列數(shù)據(jù)的請(qǐng)求非常高效,只需要連續(xù)讀出所有待查目標(biāo)列,然后遍歷處理即可;但是反過來,列式存儲(chǔ)對(duì)于獲取一行的請(qǐng)求就不那么高效了,需要多次 IO 讀多個(gè)列數(shù)據(jù),最終合并得到一行數(shù)據(jù)。另外,因?yàn)橥涣械臄?shù)據(jù)通常都具有相同的數(shù)據(jù)類型,因此列式存儲(chǔ)具有天然的高壓縮特性。
列簇式存儲(chǔ):從概念上來說,列簇式存儲(chǔ)介于行式存儲(chǔ)和列式存儲(chǔ)之間,可以通過不同的設(shè)計(jì)思路在行式存儲(chǔ)和列式存儲(chǔ)兩者之間相互切換。比如,一張表只設(shè)置一個(gè)列簇,這個(gè)列簇包含所有用戶的列。HBase 中一個(gè)列簇的數(shù)據(jù)是存儲(chǔ)在一起的,因此這種設(shè)計(jì)模式就等同于行式存儲(chǔ)。再比如,一張表設(shè)置大量列簇,每個(gè)列簇下僅有一列,很顯然這種設(shè)計(jì)模式就等同于列式存儲(chǔ)。上面兩例當(dāng)然是兩種極端的情況,在當(dāng)前體系中不建議設(shè)置太多列簇,但是這種架構(gòu)為HBase將來演變成 HTAP(Hybrid Transactional and Analytical Processing)系統(tǒng)提供了最核心的基礎(chǔ)。
- HBase 是典型的 Master-Slave 模型,系統(tǒng)中有一個(gè)管理集群的 Master 節(jié)點(diǎn)以及大量實(shí)際服務(wù)用戶讀寫的 RegionServer 節(jié)點(diǎn)。
- HBase 中所有數(shù)據(jù)最終都存儲(chǔ)在 HDFS 系統(tǒng)中,為數(shù)據(jù)提供了高可靠的保障。
- Zookeeper 節(jié)點(diǎn)為 HBase 集群提供了協(xié)調(diào)管理的作用。
- 實(shí)現(xiàn) Master 高可用:通常情況下系統(tǒng)中只有一個(gè) Master 工作,一旦 ActiveMaster 由于異常宕機(jī),ZooKeeper 會(huì)檢測(cè)到該宕機(jī)事件,并通過一定機(jī)制選舉出新的 Master,保證系統(tǒng)正常運(yùn)轉(zhuǎn)。
- 管理系統(tǒng)核心元數(shù)據(jù):比如,管理當(dāng)前系統(tǒng)中正常工作的 RegionServer 集合,保存系統(tǒng)元數(shù)據(jù)表 hbase:meta 所在的 RegionServer 地址等。
- 參與 RegionServer 宕機(jī)恢復(fù):ZooKeeper 通過心跳可以感知到 RegionServer 是否宕機(jī),并在宕機(jī)后通知 Master 進(jìn)行宕機(jī)處理。
- 實(shí)現(xiàn)分布式表鎖:HBase 中對(duì)一張表進(jìn)行各種管理操作(比如 alter 操作)需要先加表鎖,防止其他用戶對(duì)同一張表進(jìn)行管理操作,造成表狀態(tài)不一致。和其他 RDBMS 表不同,HBase 中的表通常都是分布式存儲(chǔ),ZooKeeper 可以通過特定機(jī)制實(shí)現(xiàn)分布式表鎖。
Client 在讀寫數(shù)據(jù)的過程中,不會(huì)和 Master 節(jié)點(diǎn)進(jìn)行交互,當(dāng)處理管理請(qǐng)求時(shí):包括建表、修改表、權(quán)限操作、切分表、合并數(shù)據(jù)分片以及 Compaction 等,才會(huì)和 Master 節(jié)點(diǎn)通信。
寫流程
- 1.Client 先訪問 Zookeeper 的 /hbase/meta-region-server 節(jié)點(diǎn),獲取 hbase:meta 表位于哪個(gè) RegionServer。
- 2.Client 訪問對(duì)應(yīng)的 RegionServer,獲取 hbase:meta 表,將 hbase:meta 表信息緩存在客戶端的 MetaCache,方便下次訪問。從 hbase:meta 表中找到相應(yīng) rowkey 需要訪問的 RegionServer。
- 3.Client 的 Put 操作會(huì)將數(shù)據(jù)先寫入 HLog(WAL)。
- 4.當(dāng)數(shù)據(jù)寫入 HLog 后,再將數(shù)據(jù)寫入 MemStore(內(nèi)存),數(shù)據(jù)會(huì)在 MemStore 進(jìn)行排序。
- 5.一旦數(shù)據(jù)成功寫入到 MemStore,Client 將收到 ACK。
- 6.當(dāng) MemStore 中的數(shù)據(jù)達(dá)到閾值,數(shù)據(jù)會(huì)刷寫入 HFile(磁盤)。
HBase 服務(wù)端并沒有提供 update、delete 接口,HBase 中隊(duì)數(shù)據(jù)的更新、刪除操作在服務(wù)端也認(rèn)為是寫入操作,不同的是,更新操作會(huì)寫入一個(gè)最新版本的數(shù)據(jù),刪除操作會(huì)寫入一條標(biāo)記為 deleted 的 KV 數(shù)據(jù)。
MemStore Flush 觸發(fā)條件:
- MemStore 級(jí)別限制:當(dāng) Region 中任意一個(gè) MemStore 大小達(dá)到上限(默認(rèn)是 128M),觸發(fā) MemStore 刷新。
- Region 級(jí)別限制:當(dāng) Region 中所有 MemStore 大小總和達(dá)到了上限,會(huì)觸發(fā) MemStore 刷新。
- RegionServer 級(jí)別限制:當(dāng) RegionServer 中 MemStore 的大小總和超過低水位閾值,RegionServer 開始強(qiáng)制執(zhí)行 flush,先 flush MemStore 最大的 Region,再 flush 次大的,依次執(zhí)行。如果此時(shí)的寫入吞吐量依然很高,導(dǎo)致總 MemStore 大小超過高水位閾值,RegionServer 會(huì)阻塞更新并強(qiáng)制執(zhí)行 flush,直至總 MemStore 大小降到低水位閾值。
- 當(dāng)一個(gè) RegionServer 的 HLog 數(shù)量達(dá)到上限,系統(tǒng)會(huì)選取最早的 HLog 對(duì)應(yīng)的一個(gè)或多個(gè) Region 進(jìn)行 flush。
- HBase 定期 1 小時(shí)刷新 MemStore。
- 手動(dòng)執(zhí)行 flush:用戶可以通過 shell 命令 flush 'tablename' 或者 flush 'regionname' 分別對(duì)一個(gè)表或者一個(gè) Region 進(jìn)行 flush。
HBase 系統(tǒng)內(nèi)部設(shè)計(jì)了一張?zhí)厥獾谋?— hbase:meta 表,專門用來存放整個(gè)集群所有的 Region 信息,該表存放在 Zookeeper 中。hbase:meta 中的 hbase 指的是 namespace,HBase 允許針對(duì)不同的業(yè)務(wù)設(shè)計(jì)不同的 namespace,系統(tǒng)表采用統(tǒng)一的 namespace,即 hbase;meta 指的是 hbase 這個(gè) namespace 下的表名。
讀流程
- 1、2.前兩步和寫入流程相同,如果本地沒有 hbase:meta 表的緩存或者根據(jù)緩存沒有在 RegionServer 上查到數(shù)據(jù),那么會(huì)去請(qǐng)求 Zookeeper。
- 3.分別在 BlockCache(讀緩存),MemStore 和 StoreFile(HFile)中查詢目標(biāo)數(shù)據(jù),并將查到的所有數(shù)據(jù)進(jìn)行合并。數(shù)據(jù)合并指的同一條數(shù)據(jù)的不同版本(timestamp)或者不同的類型(put/delete)。
- 4.將從文件中查詢到的數(shù)據(jù)塊(Block,HFile 數(shù)據(jù)存儲(chǔ)單元,默認(rèn)大小為 64KB)緩存到 BlockCache。
- 5.將合并后的最終結(jié)果返回給客戶端。
Hbase 的一個(gè)列簇(Column Family)本質(zhì)上就是一顆 LSM 樹(Log-Structured Merge Tree),
LSM 樹分為內(nèi)存部分和磁盤部分。內(nèi)存部分是一個(gè)維護(hù)有序數(shù)據(jù)集合的數(shù)據(jù)結(jié)構(gòu)。一般來講,內(nèi)存數(shù)據(jù)結(jié)構(gòu)可以選擇平衡二叉樹、紅黑樹、跳躍表(SkipList) 等維護(hù)有序集的數(shù)據(jù)結(jié)構(gòu)。這里由于考慮到并發(fā)性能,HBase 選擇了表現(xiàn)更優(yōu)秀的跳躍表。磁盤部分是由一個(gè)個(gè)獨(dú)立的文件組成,每一個(gè)文件又是由一個(gè)個(gè)數(shù)據(jù)塊組成。
LSM 樹的索引結(jié)構(gòu)本質(zhì)是將寫入操作全部轉(zhuǎn)化成磁盤的順序?qū)懭?,極大地提高了寫入操作的性能。
HBase 的 MemStore 在滿足閾值的情況下會(huì)將內(nèi)存中的數(shù)據(jù)刷寫成 HFile,一個(gè) MemStore 刷寫就會(huì)形成一個(gè) Hfile。隨著時(shí)間的推移,同一個(gè) Store 下的 HFile 會(huì)越來越多,文件太多會(huì)影響 HBase 查詢性能,主要體現(xiàn)在查詢數(shù)據(jù)的 IO 次數(shù)增加。為了優(yōu)化查詢性能,HBase 會(huì)合并小的 HFile 以減少文件數(shù)量,這種合并 HFile 的操作稱為 Compaction。
- Minor Compaction:會(huì)將鄰近的若干個(gè) HFile 合并,在合并過程中會(huì)清理 TTL 的數(shù)據(jù),但不會(huì)清理被刪除的數(shù)據(jù)。Minor Compaction 消耗的資源較少,通過少量的 IO 減少文件的個(gè)數(shù),提升讀取操作的性能,適合高頻率地跑。
- Major Compaction:會(huì)將一個(gè) Store 下的所有 HFile 進(jìn)行合并,并且會(huì)清理掉過期的和被刪除的數(shù)據(jù),即在 Major Compaction 會(huì)刪除全部需要?jiǎng)h除的數(shù)據(jù)。一般情況下,Major Compaction 時(shí)間會(huì)持續(xù)比較長(zhǎng),整個(gè)過程會(huì)消耗大量系統(tǒng)資源,對(duì)上層業(yè)務(wù)有比較大的影響。因此,生產(chǎn)環(huán)境下通常關(guān)閉自動(dòng)觸發(fā) Major Compaction 功能,改為手動(dòng)在業(yè)務(wù)低峰期觸發(fā)。
安裝前提
- ??部署 Zookeeper 集群??。
- ??部署好 HDFS 集群??。
節(jié)點(diǎn)規(guī)劃
|
主機(jī)名 |
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 臺(tái)機(jī)器都要配置:
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è)置將數(shù)據(jù)寫入hdfs的目錄
hbase.rootdir
hdfs://hadoop1:8020/hbase
//設(shè)置hbase模式為集群模式
hbase.cluster.distributed
true
//設(shè)置zookeeper的連接地址
hbase.zookeeper.quorum
hadoop1,hadoop2,hadoop3
編輯 conf/regionservers,配置 RegionServer 地址:
hadoop1
hadoop2
hadoop3
編輯 conf/backup-masters,配置 Backup Master 地址:
hadoop2
hadoop3
復(fù)制 hadoop1 中的 hbase 文件夾到 hadoop2、hadoop3 中,在hadoop1 中執(zhí)行如下命令:
scp -r /software/hbase hadoop2:/software/
scp -r /software/hbase hadoop3:/software/
復(fù)制 hadoop1中的 /etc/profile 到 hadoop2、hadoop3 中,然后在hadoop2、hadoop3 上執(zhí)行 source /etc/profile。
scp /etc/profile hadoop2:/etc/
scp /etc/profile hadoop3:/etc/
啟動(dòng) Hbase 集群
在 Hadoop1 節(jié)點(diǎn)上啟動(dòng) Hbase 集群:
start-hbase.sh
瀏覽器輸入 http://hadoop1:16010 訪問 Hbase WebUI 界面??梢钥吹轿覀冞\(yùn)行了 3 個(gè) RegionServer,Hadoop1 是 HMaster,Hadoop2 和 Hadoop3 是 Backup Master。
高可用測(cè)試
在 Hadoop1 上 kill 掉 HMaster 進(jìn)程。
此時(shí) HMaster 節(jié)點(diǎn)變?yōu)?Hadoop3。
測(cè)試完畢后重新在 Hadoop1 上啟動(dòng) Hbase。
連接 Hbase:
hbase shell
查看節(jié)點(diǎn)相關(guān)信息
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 個(gè)列簇 info,score,表結(jié)構(gòu)如下所示:
使用以下命令創(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é)構(gòu)
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 個(gè)參數(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ù)
默認(rèn)情況下,通過 hbase shell 的 scan 或 get 等命令獲取的中文內(nèi)容都是 16 進(jìn)制的,無法直觀的查看數(shù)據(jù)。通過 ??{FORMATTER => 'toString'}?? 可以將 16 進(jìn)制中文轉(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
文章名稱:萬字干貨,分布式數(shù)據(jù)庫(kù)HBase中文入門指南
URL地址:http://fisionsoft.com.cn/article/cdspidc.html


咨詢
建站咨詢
