1. 程式人生 > >HBase四種部署模式和基本操作

HBase四種部署模式和基本操作

 

 

本文主要包括兩部分的內容,第一部分主要包HBase的四種安裝方法,分別是:① 單機版模式,② 偽叢集模式,③ 使用HBase自帶的zookeeper構建分散式叢集,④ 使用獨立安裝的zookeeper構建分散式叢集。第二部分通過HBase shell,展示HBase的基本操作,如建立表、插入記錄、查詢記錄、刪除記錄等。

HBase的部署方式包括:

部署模式 說明
單機模式 單機版模式,常用於本地開發
偽叢集模式 使用HBase自帶的zookeeper
叢集模式 使用HBase自帶的zookeeper
叢集模式 單獨安裝zookeeper

Ⅰ HBase的安裝

本文的HBase安裝是在Hadoop已經安裝好的基礎上實現的,所以之前要匯出JAVA_HOME、HADOOP_HOME( 單機模式不需要,偽分散式模式和分散式模式需要)等環境變數以及配置好SSH互信等。

0 公共配置

匯出HBase的環境變數

export HBASE_HOME=/root/software/hbase-1.2.1
export PATH=$PATH:$HBASE_HOME/bin

檢視hbase版本 : hbase version

1 單機模式

配置hbase-env.sh

在hbase-env.sh新增如下內容

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HBASE_MANAGES_ZK=true 

說明:其中HBASE_MANAGES_ZK=true,表示由hbase自己管理zookeeper,不需要單獨的zookeeper,HBASE_MANAGES_ZK=false則表示使用獨立部署的zookeeper。

配置hbase-site.xml

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>file:///data/hbase</value>
    </property>
</configuration>

說明:hbase.rootdir,用於指定HBase資料的儲存位置,因為如果不設定的話,hbase.rootdir預設為/tmp/hbase-${user.name},這意味著每次重啟系統都會丟失資料。此配置中HBase直接使用預設的檔案系統。

啟動和停止

$HBASE_HOME/bin/start-hbase.sh
$HBASE_HOME/bin/stop-hbase.sh

2 偽叢集模式

配置hbase-env.sh

在hbase-env.sh新增如下內容

export JAVA_HOME=$JAVA_HOME
export HBASE_CLASSPATH=$HADOOP_HOME/etc/hadoop
export HBASE_MANAGES_ZK=true 
  • HBASE_MANAGES_ZK=true,表示由hbase自己管理zookeeper,不需要單獨的部署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資料的儲存位置,此時已經使用了hdfs。
  • hbase.cluster.distributed設定叢集處於分散式模式;

啟動和停止

啟動(包括啟動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新增如下內容

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資料的儲存位置;
  • hbase.cluster.distributed 設定叢集處於分散式模式;
  • hbase.master 指定hbase的hmaster的主機名和埠 ;
  • hbase.zookeeper.quorum 指定使用zookeeper的主機地址,必須是奇數個;
  • hbase.zookeeper.property 指定zookeeper資料儲存目錄,預設路徑是/tmp,如果不配置,重啟之後資料將被清空。

配置regionservers

在regionservers檔案中新增HBase的slave節點,類似hadoop中的slaves,一行一個。

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節點上的程序有:HMaster
  • slave節點上的程序有:HRegionServer、HQuorumPerr

4 叢集模式(單獨安裝zookeeper)

安裝zookeeper

zookeeper的下載和解壓這裡不贅述,直接開始zookeeper叢集的配置。
首先,匯出zookeeper環境編輯,新增如下內容到~/.bash_profile中

export ZOOKEEPER_HOME=/root/software/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin

解壓zookeeper之後,進入conf目錄,拷貝生成zoo.cfg

cp zoo_sample.cfg zoo.cfg

配置zoo.cfg。在zoo.cfg中新增如下內容

clientPort=2181
dataDir=/data/zookeeper/zk_data
server.1=master:2888:3888
server.2=slave2:2888:3888
server.3=slave3:2888:3888

說明::第一個埠是master和slave之間的通訊埠,預設是2888,第二個埠是leader選舉的埠,叢集剛啟動的時候選舉或者leader掛掉之後進行新的選舉的埠預設是3888。

分發解壓的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

建立資料目錄

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叢集包含三個節點,分別是master、slave1、slave2。寫入myid的值要和zoo.cfg中server後數值對應

啟動、停止、檢視zookeeper狀態

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,而使用獨立部署的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資料的儲存位置;
  • hbase.cluster.distributed 設定叢集處於分散式模式;
  • hbase.master 指定hbase的hmaster的主機名和埠 ;
  • hbase.zookeeper.quorum 指定使用zookeeper的主機地址,必須是奇數個;
  • hbase.zookeeper.property 指定zookeeper資料儲存目錄,預設路徑是/tmp,如果不配置,重啟之後資料將被清空。

配置regionservers

在regionservers檔案中新增HBase的slave節點,類似hadoop中的slaves,一行一個。

slave1
slave2
slave3

啟動和停止

先啟動zookeeper,參考上述“啟動、停止、檢視zookeeper狀態”。

啟動(包括啟動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節點上的程序有:HMaster、QuorumPeerMain
  • slave節點上的程序有:HRegionServer、QuorumPeerMain

說明:hbase的master節點和slave節點中都出現了QuorumPeerMain(就是zookeeper程序)而不是QuorumPeer程序,表示此時hbase使用的是獨立的zookeeper。

Ⅱ HBase的操作

下面的操作主要是在hbase的shell中操作的,進入hbase shell

hbase shell

建立表

create 'student','Sname','Ssex','Sage','Sdept','course'
create 'teacher',{NAME=>'username',VERSIONS=>5} // 建立表示指定儲存的版本數

查看錶詳情

describe 'student'

顯示所有的表

list

插入資料

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'

注意:一次只能為一個表的一行資料的一個列,也就是一個單元格新增一個數據,所以直接用shell命令插入資料效率很低,在實際應用中,一般都是利用程式設計操作資料。當執行命令:put ‘student’,’95001’,’Sname’,’LiYing’時,即為student表添加了學號為95001,名字為LiYing的一行資料,其行鍵為95001。

查詢資料

HBase中有兩個用於檢視資料的命令:
① get命令,用於查看錶的某一行資料;
② scan命令用於檢視某個表的全部資料

get 'student','95001'
get 'student','95001','course'
get 'student','95001','course:math'

scan 'student'

刪除資料

在HBase中用delete以及deleteall命令進行刪除資料操作,它們的區別是:
① delete用於刪除一個數據,是put的反向操作;
② deleteall操作用於刪除一行資料。

delete 'student','95001','Ssex'
deleteall 'student','95001'

修改資料

在新增資料時,HBase會自動為新增的資料新增一個時間戳,故在需要修改資料時,只需直接新增資料,HBase即會生成一個新的版本,從而完成“改”操作,舊的版本依舊保留,系統會定時回收垃圾資料,只留下最新的幾個版本,儲存的版本數可以在建立表的時候指定。下面是一個操作的例子:

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

參考