##[圖]HBase入門精要-百聞不如一Run

HBase入門精要-百聞不如一Run - 簡書 http://www.reibang.com/p/6aeceb5d49cf

圖1 HBase某張表中某一行縮存儲數(shù)據(jù)的一種可視化呈現(xiàn).png
圖2 HBase的行和列所構成的更像標簽椭迎,而不是表格.png
圖3 HBase架構概要圖.png

零.導讀
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" : { ... } }, // ...}

而關于其稀疏這一特性,可以用下圖來輔助理解:

圖2 HBase的行和列所構成的更像標簽秧荆,而不是表格

對于我們熟悉的關系型數(shù)據(jù)庫倔毙,如MySQL,一張表中每一行都有相同的列辰如,即使部分行的某些列不存儲數(shù)據(jù)普监,也有消耗,如圖中的NULL琉兜。而HBase,各行是相對獨立的毙玻,可以有完全不同的列豌蟋。
二.部署
如果最初階段你需要HBase環(huán)境的主要目的是想熟悉對HBase的CRDU操作,那么看完獨立部署后桑滩,可以直接跳到三.基本操作梧疲。如果希望在部署環(huán)境過程中對HBase的架構也做一個簡要了解,那么建議進行偽分布式部署运准;如果偽分布式部署你能夠很快完成幌氮,那么相信完全的分布式部署對你來說也并不困難,并且本文的主要目的是快速入門胁澳,因此不提供完全分布式部署的過程指引该互,如有需要,請參考官方指南quickstart_fully_distributed韭畸。

  1. 基礎條件
    需要Java宇智,支持JDK7和JDK8
    需要ssh蔓搞,偽分布式部署需要ssh localhost能正常連接,分布式部署需要配置各節(jié)點間的無密碼登陸(ssh passwordless login)

注:1.0.0版本開始随橘,HBase內(nèi)部組件(HMaster,HRegionServer)的默認端口從60xxx變更為16xxx

  1. 獨立部署
    如果想要最快速的搭建供你練習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/來訪問。

  1. 偽分布式部署
    偽分布式模式下基括,HBase的所有組件還是運行在同一臺主機颜懊,不同的是,每個組件獨立運行在不同的JVM风皿。更重要的是河爹,我們可以在該模式下啟動多個Regionserver和master,構成一個虛擬的分布式架構以供學習桐款,這是很多快速入門文章所略過的重點咸这。該模式下,可以對接HDFS魔眨,但那涉及hadoop的部署媳维,為以更短的時間達到當前階段的目的,本文仍存儲在本地磁盤遏暴。

a. HBase架構概要

圖3 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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末强衡,一起剝皮案震驚了整個濱河市擦秽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漩勤,老刑警劉巖感挥,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異越败,居然都是意外死亡触幼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門究飞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來置谦,“玉大人,你說我怎么就攤上這事亿傅∶较浚” “怎么了?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵葵擎,是天一觀的道長谅阿。 經(jīng)常有香客問我,道長酬滤,這世上最難降的妖魔是什么签餐? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮盯串,結果婚禮上贱田,老公的妹妹穿的比我還像新娘。我一直安慰自己嘴脾,他們只是感情好,可當我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著译打,像睡著了一般耗拓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奏司,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天乔询,我揣著相機與錄音,去河邊找鬼韵洋。 笑死竿刁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的搪缨。 我是一名探鬼主播食拜,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼副编!你這毒婦竟也來了负甸?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痹届,失蹤者是張志新(化名)和其女友劉穎呻待,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體队腐,經(jīng)...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蚕捉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柴淘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迫淹。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悠就,靈堂內(nèi)的尸體忽然破棺而出千绪,到底是詐尸還是另有隱情,我是刑警寧澤梗脾,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布荸型,位于F島的核電站,受9級特大地震影響炸茧,放射性物質(zhì)發(fā)生泄漏瑞妇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一梭冠、第九天 我趴在偏房一處隱蔽的房頂上張望辕狰。 院中可真熱鬧,春花似錦控漠、人聲如沸蔓倍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偶翅。三九已至默勾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聚谁,已是汗流浹背母剥。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留形导,地道東北人环疼。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像朵耕,于是被迫代替她去往敵國和親炫隶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內(nèi)容