HBase入門精要-百聞不如一Run - 簡書 http://www.reibang.com/p/6aeceb5d49cf
零.導讀
HBase,基于Google Bigtable實現(xiàn)的開源传藏、分布式铝阐、可伸縮的列式存儲數(shù)據(jù)庫椭符,誕生于Hadoop,也是Hadoop生態(tài)的重要一環(huán)撞芍,如今作為一個Apache頂級項目,早已經(jīng)不能將其僅僅看作Hadoop的一部分跨扮,基于Storm序无,Spark等框架的數(shù)據(jù)處理方案中验毡,都有它的身影,可以說它已經(jīng)成為大數(shù)據(jù)工具箱中非常重要的一種數(shù)據(jù)存儲工具帝嗡,也因此必然會被很納入很多人學習計劃米罚。對于一個新技術的入門,我認為一種有效的學習方式是:
對其有簡要認知后丈探,通過Quick Start式的使用录择,獲得直觀的感知,消除距離感碗降,然后再帶著使用過程中的疑問去了解其背后的真相隘竭,最后支撐我們將其應用到實際工程。
我將消除距離感這一階段讼渊,稱之為百聞不如一Run动看。
本文分三部分帶你完成對HBase的百聞不如一Run:數(shù)據(jù)模型概述、環(huán)境部署和基本操作爪幻。
版本:本文基于HBase 1.2.2 --Release date: 11/Jul/16
一. HBase數(shù)據(jù)模型
HBase是對Bigtable的開源實現(xiàn)菱皆,所以先來認識一下Bigtabl概念,引用Google's BigTable Paper中的精簡描述:
A Bigtable is a sparse, distributed, persistent multidimensional sorted map.
The map is indexed by a row key, column key, and a timestamp; each value in the map is an uninterpreted array of bytes.
HBase的數(shù)據(jù)模型與此非常相似挨稿,用一張參考自上述論文的圖來輔助理解:
圖1 HBase某張表中某一行縮存儲數(shù)據(jù)的一種可視化呈現(xiàn)
HBase的結構:
命名空間(namespace):0.96版本開始支持仇轻,是對多個表的邏輯分組,類似于關系數(shù)據(jù)庫的database奶甘,在本文暫不關心篷店。
表(table):一張表中包含若干行。
行(row):一行包括一個行鍵(row key)和若干列族臭家,一張表中的行按照行鍵排序疲陕,并用行鍵作為索引。圖1中展示了一個行鍵為row1的行钉赁。
列族(column family):每個列族包含若干個列蹄殃,列族需要在建表時預定義,運行期間可以動態(tài)加入新的列你踩。圖1中的"data"诅岩、"meta"就是row1行中的兩個列族。 在物理層面姓蜂,HBase的數(shù)據(jù)存儲是在列族這一層級進行組織按厘,每個列族單獨存儲。
列(column):每個列都歸屬于某個列族钱慢,以列族名作為前綴逮京,通常使用列族名:修飾符的形式來標識一個列,可以將其中的修飾符部分看作列名束莫。圖1中的"meta:mimetype"和"meta:size"即是列族meta中的成員懒棉。
單元格(cell):存儲的每一個值存放在一個單元格中草描,由[行,列策严,版本號]來唯一指向一個單元格穗慕。圖1中彩色標識的矩形塊即可看作是一個單元格
版本(version):版本號默認是時間戳形式,同一列中可能包含若干單元格妻导,這些單元格由版本號唯一區(qū)分逛绵,根據(jù)版本號降序排列,HBase查詢時倔韭,如果不指定版本號术浪,默認返回最新的值。圖1中的t3,t6等即代表版本號寿酌。版本是HBase多維特性的表現(xiàn)胰苏。
Google論文中Bigtable描述為一個map,那么從Map的維度醇疼,用JSON格式硕并,HBase的結構可以理解為:
{ // ... "row1" : { "family1" : { "column1" : { timestamp2 : "value1", timestamp3 : "value2" }, "column2" : {timestamp : "value3"} }, "family2" : { ... } }, "row2" : { "family3" : { ... } }, // ...}
而關于其稀疏這一特性,可以用下圖來輔助理解:
對于我們熟悉的關系型數(shù)據(jù)庫倔毙,如MySQL,一張表中每一行都有相同的列辰如,即使部分行的某些列不存儲數(shù)據(jù)普监,也有消耗,如圖中的NULL琉兜。而HBase,各行是相對獨立的毙玻,可以有完全不同的列豌蟋。
二.部署
如果最初階段你需要HBase環(huán)境的主要目的是想熟悉對HBase的CRDU操作,那么看完獨立部署后桑滩,可以直接跳到三.基本操作梧疲。如果希望在部署環(huán)境過程中對HBase的架構也做一個簡要了解,那么建議進行偽分布式部署运准;如果偽分布式部署你能夠很快完成幌氮,那么相信完全的分布式部署對你來說也并不困難,并且本文的主要目的是快速入門胁澳,因此不提供完全分布式部署的過程指引该互,如有需要,請參考官方指南quickstart_fully_distributed韭畸。
- 基礎條件
需要Java宇智,支持JDK7和JDK8
需要ssh蔓搞,偽分布式部署需要ssh localhost能正常連接,分布式部署需要配置各節(jié)點間的無密碼登陸(ssh passwordless login)
注:1.0.0版本開始随橘,HBase內(nèi)部組件(HMaster,HRegionServer)的默認端口從60xxx變更為16xxx
- 獨立部署
如果想要最快速的搭建供你練習HBase數(shù)據(jù)庫操作的環(huán)境喂分,那么這可能是你想要的。獨立部署模式下机蔗,HBase的所有進程都運行在一個JVM中蒲祈,數(shù)據(jù)直接存儲在本地磁盤。
a. 下載安裝包并解壓
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/1.2.2/hbase-1.2.2-bin.tar.gztar zxvf hbase-1.2.2-bin.tar.gz -C target-dir
b. 配置
在/etc/hosts中配置localhost的地址:127.0.0.1 localhost
JAVA_HOME:在conf/hbase-env.sh中配置,例如:export JAVA_HOME=/usr/local/jdk
配置HBase和zookeeper保存數(shù)據(jù)的位置:如果不配置萝嘁,默認寫在/tmp目錄下
在conf/hbase-site.xml.中配置,地址格式有兩種讳嘱,例如:<configuration> <property> <name>hbase.rootdir</name> <value>file:///home/hbase/hbase1.2.2</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/hbase/hbase1.2.2/zookeeper</value> </property></configuration>
c. 啟動和停止可以直接在HBase安裝目錄運行bin/start-hbase.sh啟動:
[hbase@iZ25n0dx8rxZh base]$ ./bin/start-hbase.sh starting master, logging to /usr/local/hbase/bin/../logs/hbase-hbase-master-iZ25n0dx8rxZ.out
啟動日志默認位于./logs/hbase-[username]-master-[yourhostname].log,啟動成功后酿愧,用jps命令可以看到名為HMaster的進程沥潭。接下來,你就可以使用hbase的shell來進行操作練習了嬉挡。要停止hbase钝鸽,使用bin/stop-hbase.sh。
d. UI訪問Hbase內(nèi)建了一個用Jetty提供服務的web UI頁面來查看該HBase環(huán)境的各種信息庞钢,默認端口16010拔恰,嘗試用http://hostip:16010/來訪問。
- 偽分布式部署
偽分布式模式下基括,HBase的所有組件還是運行在同一臺主機颜懊,不同的是,每個組件獨立運行在不同的JVM风皿。更重要的是河爹,我們可以在該模式下啟動多個Regionserver和master,構成一個虛擬的分布式架構以供學習桐款,這是很多快速入門文章所略過的重點咸这。該模式下,可以對接HDFS魔眨,但那涉及hadoop的部署媳维,為以更短的時間達到當前階段的目的,本文仍存儲在本地磁盤遏暴。
a. HBase架構概要
作為入門階段侄刽,先從粗粒度對HBase的架構進行簡單了解:HMaster:主要負責監(jiān)控集群、管理RegionServers的負責均衡等朋凉,可以用主-備形式部署多個Master州丹。HRegionServers:負責響應用戶的I/O操作請求,客戶端對HBase讀寫數(shù)據(jù)是與RegionServer交互侥啤。Zookeeper:負責選舉Master的主節(jié)點当叭;服務注冊茬故;保存RegionServers的狀態(tài)等∫媳睿可以使用系統(tǒng)內(nèi)建的zookeeper磺芭,也可以使用獨立的zookeeper,只需要在配置文件中調(diào)整即可醉箕。HDFS:真正的數(shù)據(jù)持久層钾腺,并非必須是HDFS文件系統(tǒng),但搭配HDFS是最佳選擇讥裤,也是目前應用最廣泛的選擇放棒。
b. 開始部署偽分布式模式下,需要保證ssh localhost能夠成功連接(將HBase所屬用戶的publickey追加到其自身的authorized_keys中)己英。如果你跟隨本文啟動了獨立模式的HBase间螟,先將其停止。
開啟分布式配置最基本的偽分布式配置损肛,只需要在獨立模式的配置基礎上厢破,追加開啟分布式模式的配置,即將hbase.cluster.distributed配置為true治拿,例如:<configuration> <property> <name>hbase.rootdir</name> <value>/home/hbase/hbase1.2.2</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>file:///home/hbase/hbase1.2.2/zookeeper</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> </configuration>
在安裝目錄運行bin/start-hbase.sh[hbase@iZ25n0dx8rxZ hbase]$ ./bin/start-hbase.shlocalhost: starting zookeeper, logging to /usr/local/hbase/bin/../logs/hbase-hbase-zookeeper-iZ25n0dx8rxZ.outstarting master, logging to /usr/local/hbase/bin/../logs/hbase-hbase-master-iZ25n0dx8rxZ.outstarting regionserver, logging to /usr/local/hbase/bin/../logs/hbase-hbase-1-regionserver-iZ25n0dx8rxZ.out
可以看到依次啟動了zookeeper摩泪、master和regionserver,啟動日志為./logs路徑下的.log文件劫谅。
查看啟動的進程以及占用的端口:
[hbase@iZ25n0dx8rxZ logs]$ jps4610 HRegionServer4456 HQuorumPeer5338 Jps4522 HMaster[hbase@iZ25n0dx8rxZ logs]$ netstat -lnp|grep 4522tcp 0 0 172.16.5.23:16000 0.0.0.0:* LISTEN 4522/java tcp 0 0 0.0.0.0:16010 0.0.0.0:* LISTEN 4522/java [hbase@iZ25n0dx8rxZ logs]$ netstat -lnp|grep 4610tcp 0 0 172.16.5.23:16201 0.0.0.0:* LISTEN 4610/java tcp 0 0 0.0.0.0:16301 0.0.0.0:* LISTEN 4610/java [root@iZ25n0dx8rxZ logs]$ netstat -lnp|grep 4456tcp 0 0 0.0.0.0:2188 0.0.0.0:* LISTEN 4456/java
HMaster占用16000(工作進程)和16010(Master的web UI服務端口)
HRegionServer占用16201(工作進程)和16301(Regionserver的web UI服務)
HQuorumPeer是HBase內(nèi)建zookeeper進程见坑,默認端口2181(即zookeeper的默認配置)。如果是獨立的zookeeper捏检,進程名是QuorumPeerxxx荞驴,沒有第一個字母H。
啟動和停止備份Master節(jié)點(backup HMaster):
運行./bin/local-master-backup.sh start n來啟動一個備份節(jié)點未檩,如:
[hbase@iZ25n0dx8rxZ hbase]$ ./bin/local-master-backup.sh start 1starting master, logging to /usr/local/hbase/bin/../logs/hbase-hbase-1-master-iZ25n0dx8rxZ.out
啟動成功后戴尸,jps命令可以看到總共有兩個HMaster進程。
端口:n用來指定占用的端口號冤狡,規(guī)則為[默認端口號+n],如例子中的./bin/local-master-backup.sh start 1所啟動的HMaster占用16001(工作端口)和16011(web UI服務端口),以此類推项棠。
日志:啟動日志在./logs/hbase-[username]-n-master-[hostname].log悲雳,在上例的日志中,可以看到這樣一行日志說明該節(jié)點目前是作為備用節(jié)點:master.ActiveMasterManager: Another master is the active master, iz25n0dx8rxz,16000,1469262015657; waiting to become the next active master
注意:如果使用1.2.2之前版本的安裝包(如1.1.5)香追,運行啟動腳本后backup Master可能會因為端口被占用而無法啟動合瓢,這是因為腳本里面,沒有按照規(guī)則更改backup Master的工作端口透典,啟動時仍然使用默認的16000晴楔,而該端口已經(jīng)被前面啟動的主節(jié)點占用顿苇。可以通過如下方法解決該問題:手動在./bin/local-master-backup.sh
腳本中為HBASE_MASTER_ARGS
賦值這句話內(nèi)添加-D hbase.master.port=expr 16000 + $DN
來設置backup Master的工作端口,添加后這句話的完整內(nèi)容如下:HBASE_MASTER_ARGS="-D hbase.master.port=expr 16000 + $DN
-D hbase.master.info.port=expr 16010 + $DN
-D hbase.regionserver.port=expr 16020 + $DN
-D hbase.regionserver.info.port=expr 16030 + $DN
--backup"
web UI訪問地址:http://ip:1601n/
主節(jié)點切換:要觀察HBase的Master組件主節(jié)點切換税弃,可以使用kill -9 PID停止當前主節(jié)點(即最初啟動的HMaster)纪岁,此時剛啟動的備份節(jié)點將切換為主節(jié)點,可以在備份節(jié)點的日志(./logs/hbase-[username]-1-master-[hostname].log)中看到如下內(nèi)容:
INFO [iZ25n0dx8rxZ:16001.activeMasterManager] master.ActiveMasterManager: Deleting ZNode for /hbase/backup-masters/iz25n0dx8rxz,16001,1469267021567 from backup master directoryINFO [iZ25n0dx8rxZ:16001.activeMasterManager] master.ActiveMasterManager: Registered Active Master=iz25n0dx8rxz,16001,1469267021567
停止:使用./bin/local-master-backup.sh stop n來停止你的備份節(jié)點则果。
多備:可以一次啟動多個backup HMaster幔翰,命令類似于./bin/local-master-backup.sh start x y z。
啟動和停止額外的RegionServer運行額外RegionServer的方式與backup HMaster類似西壮,啟動:./bin/local-regionservers.sh start n遗增,停止:./bin/local-regionservers.sh stop n
web UI訪問地址:http://ip:1630n/
三. 基本操作
本節(jié)介紹使用HBase shell在直接在服務器上對HBase進行基本操作,HBase shell是在(J)Ruby的IRB的基礎上增加了HBase特有的命令款青,遵循IRB的操作做修。
連接:./bin/hbase shell[hbase@iZ25n0dx8rxZ hbase]$ ./bin/hbase shellHBase Shell; enter 'help<RETURN>' for list of supported commands.Type "exit<RETURN>" to leave the HBase ShellVersion 1.2.2, r3f671c1ead70d249ea4598f1bbcc5151322b3a13, Fri Jul 1 08:28:55 CDT 2016hbase(main):001:0>
建表:create 'test', 'cf1', 'cf2',即[create '表名', '列族名',..]抡草,列族名可以有多個饰及,list用于查看有哪些表
hbase(main):008:0> create 'test','cf1','cf2'0 row(s) in 1.2280 seconds=> Hbase::Table - testhbase(main):009:0>
寫數(shù)據(jù):put 'test', 'row1', 'cf1:c1', 'value1',即[put '表名','行鍵','列族名:列名','數(shù)據(jù)']
hbase(main):001:0> put 'test','row1','cf1:c1','value1'0 row(s) in 0.3160 secondshbase(main):002:0> put 'test','row1','cf1:c1','value2'0 row(s) in 0.3020 seconds
查看數(shù)據(jù):全表數(shù)據(jù):scan 'test'渠牲,即[scan '表名']hbase(main):001:0> scan 'test'ROW COLUMN+CELLrow1 column=cf1:c1, timestamp=1469277197280, value=value2 1 row(s) in 0.2710 secondshbase(main):002:0>
可以看到在put時指定的屬性之外旋炒,有一個timestamp屬性來作為版本標識,我們查看全表數(shù)據(jù)時签杈,row1的cf1:c1列中展示的值是我們后一次寫入的value2瘫镇,sacn和get在不指定版本時,得到的是最近版本的數(shù)據(jù)
指定行的數(shù)據(jù):get 'test', 'row1'答姥,即[get '表名','行鍵']
指定版本的數(shù)據(jù):hbase(main):005:0> get 'test','row1',{COLUMN=>'cf1:c1',TIMESTAMP=>1469277197280}COLUMN CELL cf1:c1 timestamp=1469277197280, value=value1 1 row(s) in 0.0270 secondshbase(main):006:0>
版本數(shù)量:每個列族有一個單獨的VERSIONS屬性铣除,默認為1,可以在建表時指定:create 'test1',{NAME=>'cf1',VERSIONS=>3}
鹦付,代表該列族的每個列最多保存最近3個版本的數(shù)據(jù)尚粘,也可以通過alter來更新:alter 'test1',NAME=>'cf1',VERSIONS=>3
。查詢數(shù)據(jù)時敲长,可以通過設置VERSIONS來指定顯示最近幾個版本的數(shù)據(jù)(最大范圍不超過該列族的VERSIONS屬性值):get 'test','row1',{COLUMN=>'cf1:c1',VERSIONS=>2}
刪除數(shù)據(jù):刪除指定單元格:delete 'test','row1','cf1:c1',1469277197280郎嫁,將刪除指定版本以及比其更早的版本
刪除指定行的指定列:delete 'test','row1','cf1:c1'
刪除整行: deleteall 'test','row1'
禁用表:disable 'test',即[disable '表名']祈噪,在要刪除表或者變更配置時泽铛,要先禁用該表。相應的辑鲤,要重新啟用該表盔腔,使用[enable '表名']
刪除表:drop 'test',即[drop '表名']
退出HBase shell:exit或者quit
完整的命令列表,參考hbase-shell-commands
四. 尾聲
本文簡要介紹了HBase的數(shù)據(jù)模型弛随、快速搭建基本操作環(huán)境的步驟以及基于HBase shell的HBase數(shù)據(jù)庫基本操作瓢喉,旨在協(xié)助想要學習HBase的朋友快速進入到對HBase的操作和使用階段,消除陌生感和距離感舀透。在這之后栓票,我們可能想問,真正應用在工程上的操作HBase的方式有哪些盐杂,HBase存取數(shù)據(jù)的完整過程是怎樣的逗载,怎樣去設計一個適合的表結構,等等链烈,那么厉斟,請帶著這些問題繼續(xù)你的HBase之路。
References
Apache HBase ? Reference GuideGoogle's BigTable PaperUnderstanding HBase and BigTable