HBase的安裝與部署


一、硬件環境

假設有4台機,IP及主機名如下:

192.168.100.105 c1
192.168.100.110 c2
192.168.100.115 c3
192.168.100.120 c4

 

二、軟件環境

操作系統:Ubuntu Server 18.04

JDK:1.8.0

* 這里的ZooKeeper、Hadoop、HBase根目錄都放在/home/目錄下

1.安裝JDK

https://www.cnblogs.com/live41/p/14235891.html

 

2.安裝ZooKeeper

https://www.cnblogs.com/live41/p/15522363.html

* 雖然HBase內置了ZooKeeper,但一般是關閉內置版,使用獨立部署版(因為還有其它進程需要用到ZooKeeper,以免維護2套)。

 

3.安裝分布式Hadoop

https://www.cnblogs.com/live41/p/15483192.html

 

三、部署HBase

* 先登錄root賬號再進行以下操作

1.下載安裝包

http://hbase.apache.org/downloads.html

下載bin文件,例如hbase-2.4.6-bin.tar

 

* 以下步驟在每台機都要執行

2.上傳安裝包到服務器並解壓

假設安裝在home目錄

cd /home
rz

 

3.解壓

tar -xvf hbase-2.4.6-bin.tar
mv hbase-2.4.6 hbase

 

4.配置環境變量

vim ~/.bashrc

在里面加入以下內容:

export PATH=$PATH:/usr/local/hbase/bin

保存退出后,更新環境變量:

source ~/.bashrc

 

三、配置HBase

* 以下步驟只在c1機執行,然后用scp命令把配置文件同步到其它機。

1.配置hbase-env.sh

vim /home/hbase/conf/hbase-env.sh

添加或反注釋后添加以下內容:

export JAVA_HOME=/usr/bin/java1.8.0
export HBASE_CLASSPATH=/home/hbase/conf
export HBASE_MANAGES_ZK=false

 

2.配置hbase-site.xml

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://ns6/hbase</value> <!--對應hdfs-site.xml的dfs.nameservices屬性值-->
    </property>

    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>c1,c2,c3</value>
    </property>
    <property>
        <name>hbase.zookeeper.property.clientPort</name>
        <value>2181</value>
    </property>

    <property>
        <name>hbase.master</name>
        <value>60000</value>
        <description>單機版需要配主機名/IP和端口,HA方式只需要配端口</description>
    </property>
    <property>
        <name>hbase.master.info.bindAddress</name>
        <value>0.0.0.0</value>
    </property>
    <property>
        <name>hbase.master.port</name>
        <value>16000</value>
    </property>
    <property>
        <name>hbase.master.info.port</name>
        <value>16010</value>
    </property>
    <property>
        <name>hbase.regionserver.port</name>
        <value>16020</value>
    </property>
    <property>
        <name>hbase.regionserver.info.port</name>
        <value>16030</value>
    </property>

    <property>
        <name>hbase.wal.provider</name>
        <value>filesystem</value> <!--也可以用multiwal-->
    </property>
</configuration>

 

3.配置regionservers

vim regionservers

添加以下內容,如果原來有localhost,先刪除。

c1
c2
c3
c4

這里是對應hosts文件的配置,前面已經提及過。


4.復制Hadoop的關鍵配置文件到conf目錄

* 執行這步需要先配置免密登錄

cd /home/hadoop/etc/hadoop
cp core-site.xml hdfs-site.xml /home/hbase/conf

* 如果不執行這一步,啟動HBase時會報錯:

ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
java.lang.IllegalArgumentException: java.net.UnknownHostException: ns6

原因是hbase-site.xml的hbase.rootdir屬性使用了dfs.nameservices的值(也就是上面的ns6)。

如果不用dfs.nameservices的值,而是寫死某個NameNode入口(例如c1:9000),則會有單點故障風險。

 

5.復制配置文件到其它節點

cd /home/hbase/conf
scp * c2:/home/hbase/conf
scp * c3:/home/hbase/conf
scp * c4:/home/hbase/conf

 

四、啟動和停止HBase

1.在主節點機

* 這里是c1機

start-hbase.sh

 

2.在備用節點機(可選操作,不一定要執行此步驟)

* 這里是c2機

需要手動啟動,否則ZooKeeper只會啟動1個。也可以選擇不啟動。

hbase-daemon.sh start master

 

3.停止

stop-hbase.sh

 

五、測試

1.命令行測試

登入HBase(跟MySQL類似)

hbase shell

hbase shell命令介紹:

https://blog.csdn.net/vbirdbest/article/details/88236575


2.瀏覽器測試

用瀏覽器打開:

http://192.168.100.105:16010/

HBase v1.0版本之前默認端口是60010,之后的版本是16010。

 

3.程序測試

使用Java編寫程序調用HBase API來操作HBase。

(1) 先配置hosts的機器名和IP映射

需要先在運行Java程序的機器的hosts文件加入機器名和IP的映射。否則程序運行時會卡死或連接失敗。

192.168.100.105 c1
192.168.100.110 c2
192.168.100.115 c3
192.168.100.120 c4

 

(2) 修改Maven配置文件(pom.xml)

在<dependencies></dependencies>節點內加入:

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.4.7</version>
</dependency>

* 其中三個version節點的2.4.7是對應HBase的版本。例如,安裝的HBase是v2.4.0,那三個version節點就填2.4.0

 

(3) 實現代碼

創建一張表,表名叫"User",添加2個列族分別叫"login"、"profile"。

public class HBaseCreateTable
{
    public static void main(String[] args)
    {
        String quorum = "c1,c2,c3";
        String tableName = "Users";
        String[] familyNames = {"login", "profile"};
        try
        {
            createTable(quorum, tableName, familyNames);
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }

    private static void createTable(String quorum, String tableName, String[] familyNames) throws Exception
    {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", quorum);

        Connection conn = ConnectionFactory.createConnection(conf);
        Admin admin = conn.getAdmin();
        TableName tb = TableName.valueOf(tableName);
        if (!admin.tableExists(tb))
        {
            TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tb);
            for (String name : familyNames)
            {
                ColumnFamilyDescriptor cfd = ColumnFamilyDescriptorBuilder.of(name);
                builder.setColumnFamily(cfd);
            }
            TableDescriptor desc = builder.build();
            admin.createTable(desc);
        }

        if (admin != null)
        {
            admin.close();
        }
        if (conn != null)
        {
            conn.close();
        }
    }
}

* 切記務必要執行第(1)點,否則程序運行會卡死。

參考文章:https://www.cnblogs.com/live41/p/15504691.html

 

 

附:hbase-site.xml參數說明

  • hbase.rootdir

這個目錄是 RegionServer 的共享目錄,用來持久化 HBase。特別注意的是 hbase.rootdir 里面的 HDFS 地址是要跟 Hadoop 的 core-site.xml 里面的 fs.defaultFS 的 HDFS 的 IP 地址或者域名、端口必須一致。(HA環境下,dfs.nameservices  是由zookeeper來決定的)

  • hbase.cluster.distributed

HBase 的運行模式。為 false 表示單機模式,為 true 表示分布式模式。若為 false,HBase 和 ZooKeeper 會運行在同一個 JVM 中

  • hbase.master

如果只設置單個 Hmaster,那么 hbase.master 屬性參數需要設置為 master:60000 (主機名:60000)

如果要設置多個 Hmaster,那么我們只需要提供端口 60000,因為選擇真正的 master 的事情會有 zookeeper 去處理

  • hbase.tmp.dir

本地文件系統的臨時文件夾。可以修改到一個更為持久的目錄上。(/tmp會在重啟時清除)

  • hbase.zookeeper.quorum

對於 ZooKeeper 的配置。至少要在 hbase.zookeeper.quorum 參數中列出全部的 ZooKeeper 的主機,用逗號隔開。該屬性值的默認值為 localhost,這個值顯然不能用於分布式應用中。

  • hbase.zookeeper.property.dataDir

這個參數用戶設置 ZooKeeper 快照的存儲位置,默認值為 /tmp,顯然在重啟的時候會清空。因為筆者的 ZooKeeper 是獨立安裝的,所以這里路徑是指向了 $ZOOKEEPER_HOME/conf/zoo.cfg 中 dataDir 所設定的位置。

  • hbase.zookeeper.property.clientPort

客戶端連接 ZooKeeper 的端口。默認是2181。

  • zookeeper.session.timeout

ZooKeeper 會話超時。Hbase 把這個值傳遞改 zk 集群,向它推薦一個會話的最大超時時間

  • hbase.regionserver.restart.on.zk.expire

當 regionserver 遇到 ZooKeeper session expired, regionserver 將選擇 restart 而不是 abort。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM