一、硬件環境
假設有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.瀏覽器測試
用瀏覽器打開:
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。