本文主要包括兩部分的內(nèi)容,第一部分主要包HBase的四種安裝方法,分別是:① 單機(jī)版模式,② 偽集群模式,③ 使用HBase自帶的zookeeper構(gòu)建分布式集群,④ 使用獨(dú)立安裝的zookeeper構(gòu)建分布式集群。第二部分通過HBase shell,展示HBase的基本操作,如創(chuàng)建表、插入記錄、查詢記錄、刪除記錄等。
HBase的部署方式包括:
| 部署模式 | 說明 |
|---|---|
| 單機(jī)模式 | 單機(jī)版模式,常用于本地開發(fā) |
| 偽集群模式 | 使用HBase自帶的zookeeper |
| 集群模式 | 使用HBase自帶的zookeeper |
| 集群模式 | 單獨(dú)安裝zookeeper |
Ⅰ HBase的安裝
本文的HBase安裝是在Hadoop已經(jīng)安裝好的基礎(chǔ)上實(shí)現(xiàn)的,所以之前要導(dǎo)出JAVA_HOME、HADOOP_HOME( 單機(jī)模式不需要,偽分布式模式和分布式模式需要)等環(huán)境變量以及配置好SSH互信等。
0 公共配置
導(dǎo)出HBase的環(huán)境變量
export HBASE_HOME=/root/software/hbase-1.2.1
export PATH=$PATH:$HBASE_HOME/bin
查看hbase版本 : hbase version
1 單機(jī)模式
配置hbase-env.sh
在hbase-env.sh添加如下內(nèi)容
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HBASE_MANAGES_ZK=true
說明:其中HBASE_MANAGES_ZK=true,表示由hbase自己管理zookeeper,不需要單獨(dú)的zookeeper,HBASE_MANAGES_ZK=false則表示使用獨(dú)立部署的zookeeper。
配置hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:///data/hbase</value>
</property>
</configuration>
說明:hbase.rootdir,用于指定HBase數(shù)據(jù)的存儲位置,因?yàn)槿绻辉O(shè)置的話,hbase.rootdir默認(rèn)為/tmp/hbase-${user.name},這意味著每次重啟系統(tǒng)都會丟失數(shù)據(jù)。此配置中HBase直接使用默認(rèn)的文件系統(tǒng)。
啟動和停止
$HBASE_HOME/bin/start-hbase.sh
$HBASE_HOME/bin/stop-hbase.sh
2 偽集群模式
配置hbase-env.sh
在hbase-env.sh添加如下內(nèi)容
export JAVA_HOME=$JAVA_HOME
export HBASE_CLASSPATH=$HADOOP_HOME/etc/hadoop
export HBASE_MANAGES_ZK=true
- HBASE_MANAGES_ZK=true,表示由hbase自己管理zookeeper,不需要單獨(dú)的部署zookeeper。
- export HBASE_CLASSPATH="", 表示使用hdfs作為HBase的儲存。
配置hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
</configuration>
說明:
- base.rootdir,用于指定HBase數(shù)據(jù)的存儲位置,此時(shí)已經(jīng)使用了hdfs。
- hbase.cluster.distributed設(shè)置集群處于分布式模式;
啟動和停止
啟動(包括啟動hdfs和hbase)
$HBASE_HOME/sbin/start-dfs.sh
$HBASE_HOME/bin/start-hbase.sh
停止(包括停止hbase和hdfs)
$HBASE_HOME/bin/stop-hbase.sh
$HBASE_HOME/sbin/stop-dfs.sh
3 集群模式(使用hbase自帶的zookeeper)
配置hbase-env.sh
在hbase-env.sh添加如下內(nèi)容
export JAVA_HOME=$JAVA_HOME
export HBASE_CLASSPATH=$HADOOP_HOME/etc/hadoop
export HBASE_MANAGES_ZK=true
- HBASE_MANAGES_ZK=true,表示使用hbase自帶的zookeeper。
配置hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>master:6000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>slave1:2181,slave2:2181,slave3:2181</value>
</property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property</name>
<value>/data/zookeeper/data</value>
</property>
</configuration>
說明:
- base.rootdir 用于指定HBase數(shù)據(jù)的存儲位置;
- hbase.cluster.distributed 設(shè)置集群處于分布式模式;
- hbase.master 指定hbase的hmaster的主機(jī)名和端口 ;
- hbase.zookeeper.quorum 指定使用zookeeper的主機(jī)地址,必須是奇數(shù)個(gè);
- hbase.zookeeper.property 指定zookeeper數(shù)據(jù)存儲目錄,默認(rèn)路徑是/tmp,如果不配置,重啟之后數(shù)據(jù)將被清空。
配置regionservers
在regionservers文件中添加HBase的slave節(jié)點(diǎn),類似hadoop中的slaves,一行一個(gè)。
slave1
slave2
slave3
啟動和停止
啟動(包括啟動hdfs和hbase)
$HBASE_HOME/sbin/start-dfs.sh
$HBASE_HOME/bin/start-hbase.sh
停止(包括停止hbase和hdfs)
$HBASE_HOME/bin/stop-hbase.sh
$HBASE_HOME/sbin/stop-dfs.sh
HBase啟動成功之后:
- master節(jié)點(diǎn)上的進(jìn)程有:HMaster
- slave節(jié)點(diǎn)上的進(jìn)程有:HRegionServer、HQuorumPerr
4 集群模式(單獨(dú)安裝zookeeper)
安裝zookeeper
zookeeper的下載和解壓這里不贅述,直接開始zookeeper集群的配置。
首先,導(dǎo)出zookeeper環(huán)境編輯,添加如下內(nèi)容到~/.bash_profile中
export ZOOKEEPER_HOME=/root/software/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin
解壓zookeeper之后,進(jìn)入conf目錄,拷貝生成zoo.cfg
cp zoo_sample.cfg zoo.cfg
配置zoo.cfg。在zoo.cfg中添加如下內(nèi)容
clientPort=2181
dataDir=/data/zookeeper/zk_data
server.1=master:2888:3888
server.2=slave2:2888:3888
server.3=slave3:2888:3888
說明::第一個(gè)端口是master和slave之間的通信端口,默認(rèn)是2888,第二個(gè)端口是leader選舉的端口,集群剛啟動的時(shí)候選舉或者leader掛掉之后進(jìn)行新的選舉的端口默認(rèn)是3888。
分發(fā)解壓的zookeeper到slave2、slave3
scp -r /root/software/zookeeper-3.4.10 slave2:/root/software/zookeeper-3.4.10
scp -r /root/software/zookeeper-3.4.10 slave3:/root/software/zookeeper-3.4.10
創(chuàng)建數(shù)據(jù)目錄
ssh root@master 'mkdir -p /data/zookeeper/zk_data'
ssh root@slave2 'mkdir -p /data/zookeeper/zk_data'
ssh root@slave3 'mkdir -p /data/zookeeper/zk_data'
寫入myid
ssh root@master 'echo 1 > /data/zookeeper/zk_data/myid'
ssh root@slave2 'echo 2 > /data/zookeeper/zk_data/myid'
ssh root@slave3 'echo 3 > /data/zookeeper/zk_data/myid'
注意:本文部署的zookeeper集群包含三個(gè)節(jié)點(diǎn),分別是master、slave1、slave2。寫入myid的值要和zoo.cfg中server后數(shù)值對應(yīng)。
啟動、停止、查看zookeeper狀態(tài)
ssh root@master '/root/software/zookeeper-3.4.10/bin/zkServer.sh start'
ssh root@slave2 '/root/software/zookeeper-3.4.10/bin/zkServer.sh start'
ssh root@slave3 '/root/software/zookeeper-3.4.10/bin/zkServer.sh start'
ssh root@master '/root/software/zookeeper-3.4.10/bin/zkServer.sh status'
ssh root@slave2 '/root/software/zookeeper-3.4.10/bin/zkServer.sh status'
ssh root@slave3 '/root/software/zookeeper-3.4.10/bin/zkServer.sh status'
ssh root@master '/root/software/zookeeper-3.4.10/bin/zkServer.sh stop'
ssh root@slave2 '/root/software/zookeeper-3.4.10/bin/zkServer.sh stop'
ssh root@slave3 '/root/software/zookeeper-3.4.10/bin/zkServer.sh stop'
配置hbase-env.sh
export JAVA_HOME=$JAVA_HOME
export HBASE_CLASSPATH=$HADOOP_HOME/etc/hadoop
export HBASE_MANAGES_ZK=false
其中HBASE_MANAGES_ZK=false,表示不使用hbase自帶的zookeeper,而使用獨(dú)立部署的zookeeper。
配置hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>master:6000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>slave1:2181,slave2:2181,slave3:2181</value>
</property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property</name>
<value>/data/zookeeper/data</value>
</property>
</configuration>
說明:
- base.rootdir 用于指定HBase數(shù)據(jù)的存儲位置;
- hbase.cluster.distributed 設(shè)置集群處于分布式模式;
- hbase.master 指定hbase的hmaster的主機(jī)名和端口 ;
- hbase.zookeeper.quorum 指定使用zookeeper的主機(jī)地址,必須是奇數(shù)個(gè);
- hbase.zookeeper.property 指定zookeeper數(shù)據(jù)存儲目錄,默認(rèn)路徑是/tmp,如果不配置,重啟之后數(shù)據(jù)將被清空。
配置regionservers
在regionservers文件中添加HBase的slave節(jié)點(diǎn),類似hadoop中的slaves,一行一個(gè)。
slave1
slave2
slave3
啟動和停止
先啟動zookeeper,參考上述“啟動、停止、查看zookeeper狀態(tài)”。
啟動(包括啟動hdfs和hbase)
$HBASE_HOME/sbin/start-dfs.sh
$HBASE_HOME/bin/start-hbase.sh
停止(包括停止hbase和hdfs)
$HBASE_HOME/bin/stop-hbase.sh
$HBASE_HOME/sbin/stop-dfs.sh
HBase啟動成功之后:
- master節(jié)點(diǎn)上的進(jìn)程有:HMaster、QuorumPeerMain
- slave節(jié)點(diǎn)上的進(jìn)程有:HRegionServer、QuorumPeerMain
說明:hbase的master節(jié)點(diǎn)和slave節(jié)點(diǎn)中都出現(xiàn)了QuorumPeerMain(就是zookeeper進(jìn)程)而不是QuorumPeer進(jìn)程,表示此時(shí)hbase使用的是獨(dú)立的zookeeper。
Ⅱ HBase的操作
下面的操作主要是在hbase的shell中操作的,進(jìn)入hbase shell
hbase shell
創(chuàng)建表
create 'student','Sname','Ssex','Sage','Sdept','course'
create 'teacher',{NAME=>'username',VERSIONS=>5} // 創(chuàng)建表示指定保存的版本數(shù)
查看表詳情
describe 'student'
顯示所有的表
list
插入數(shù)據(jù)
put 'student','95001','Sname','LiYing'
put 'student','95001','Ssex','Male'
put 'student','95001','course:math','80'
put 'student','95001','course:english','90'
put 'student','95002','Sname','ZhangYiDa'
put 'student','95002','Ssex','Femal'
put 'student','95002','course:math','90'
put 'student','95002','course:english','70'
注意:一次只能為一個(gè)表的一行數(shù)據(jù)的一個(gè)列,也就是一個(gè)單元格添加一個(gè)數(shù)據(jù),所以直接用shell命令插入數(shù)據(jù)效率很低,在實(shí)際應(yīng)用中,一般都是利用編程操作數(shù)據(jù)。當(dāng)運(yùn)行命令:put ‘student’,’95001’,’Sname’,’LiYing’時(shí),即為student表添加了學(xué)號為95001,名字為LiYing的一行數(shù)據(jù),其行鍵為95001。
查詢數(shù)據(jù)
HBase中有兩個(gè)用于查看數(shù)據(jù)的命令:
① get命令,用于查看表的某一行數(shù)據(jù);
② scan命令用于查看某個(gè)表的全部數(shù)據(jù)
get 'student','95001'
get 'student','95001','course'
get 'student','95001','course:math'
scan 'student'
刪除數(shù)據(jù)
在HBase中用delete以及deleteall命令進(jìn)行刪除數(shù)據(jù)操作,它們的區(qū)別是:
① delete用于刪除一個(gè)數(shù)據(jù),是put的反向操作;
② deleteall操作用于刪除一行數(shù)據(jù)。
delete 'student','95001','Ssex'
deleteall 'student','95001'
修改數(shù)據(jù)
在添加數(shù)據(jù)時(shí),HBase會自動為添加的數(shù)據(jù)添加一個(gè)時(shí)間戳,故在需要修改數(shù)據(jù)時(shí),只需直接添加數(shù)據(jù),HBase即會生成一個(gè)新的版本,從而完成“改”操作,舊的版本依舊保留,系統(tǒng)會定時(shí)回收垃圾數(shù)據(jù),只留下最新的幾個(gè)版本,保存的版本數(shù)可以在創(chuàng)建表的時(shí)候指定。下面是一個(gè)操作的例子:
hbase(main):034:0> get 'student','95001'
COLUMN CELL
Sname: timestamp=1537497681798, value=LiYing
Ssex: timestamp=1537497682400, value=Male
course:english timestamp=1537497872225, value=90
course:math timestamp=1537497681859, value=80
4 row(s) in 0.0310 seconds
hbase(main):035:0> put 'student','95001','course:english','100'
0 row(s) in 0.0130 seconds
hbase(main):036:0> get 'student','95001'
COLUMN CELL
Sname: timestamp=1537497681798, value=LiYing
Ssex: timestamp=1537497682400, value=Male
course:english timestamp=1537498062541, value=100
course:math timestamp=1537497681859, value=80
4 row(s) in 0.0130 seconds
刪除表
刪除表有兩步,第一步先讓該表不可用,第二步刪除表。直接drop未disable的表會失敗。
disable 'student'
drop 'student'
查詢歷史的表
create 'teacher',{NAME=>'username',VERSIONS=>5}
put 'teacher','91001','username','Mary'
put 'teacher','91001','username','Mary1'
put 'teacher','91001','username','Mary2'
put 'teacher','91001','username','Mary3'
put 'teacher','91001','username','Mary4'
put 'teacher','91001','username','Mary5'
get 'teacher','91001',{COLUMN=>'username',VERSIONS=>5}
hbase(main):064:0> get 'teacher','91001',{COLUMN=>'username',VERSIONS=>5}
COLUMN CELL
username: timestamp=1537498459746, value=Mary5
username: timestamp=1537498455244, value=Mary4
username: timestamp=1537498455193, value=Mary3
username: timestamp=1537498455174, value=Mary2
username: timestamp=1537498455149, value=Mary1
5 row(s) in 0.0110 seconds
退出hbase
exit