本文所搭建的 HBase 版本為 HBase 0.98.6-cdh5.3.2。HBase 有兩種運行模式:單機模式 和 分布式模式。本文只重點(diǎn)講解 “分布式模式“。
在搭建 HBase 0.98.6-cdh5.3.2 之前,筆者已經(jīng)在集群搭建并啟動(dòng)好 Hadoop 和 ZooKeeper 集群。具體請參考:
在開(kāi)始安裝 HBase 之前需要做一些準備工作,這涉及到系統設置、分布式模式 Hadoop 的部署及 HBase 自身的配置,因此要確保在運行 Hbase 之前這些條件已經(jīng)具備。以下將介紹 HBase 依賴(lài)的一些重要的中間件、系統服務(wù)或配置。
| IP | 主機名 | 用戶(hù)名 | HBase 地位 | 啟動(dòng)后進(jìn)程 |
|---|---|---|---|---|
| 10.6.3.43 | master5 | hadoop5 | 主 Master | HMaster |
| 10.6.3.33 | master52 | hadoop5 | 備份 Master | HMaster |
| 10.6.3.48 | slave51 | hadoop5 | RegionServer | HRegionServer |
| 10.6.3.32 | slave52 | hadoop5 | RegionServer | HRegionServer |
| 10.6.3.38 | slave53 | hadoop5 | RegionServer | HRegionServer |
1. 安裝 jdk 1.8.0
安裝 jdk 1.8.0 至 /usr/local/jdk1.8.0_60 ,具體請參考 “安裝 jdk1.8.0”
2. 配置免密 ssh 登陸
具體請參考:Centos6.5下SSH免密碼登陸配置
3. 域名系統 DNS
Hbase 通過(guò)本地主機名 (Host Name)或 域名 (Domain Name)來(lái)獲取 IP 地址,因此要確保正向和反向 DNS 解析是正常的。在進(jìn)行 DNS 解析時(shí)會(huì )首先本地 /etc/hosts 文件,因此建議通過(guò)配置該文件指定主機名或域名到 IP 地址的映射關(guān)系而不使用域名解析服務(wù),這樣做將更易于維護,當出現主機無(wú)法識別的異常時(shí)也更加容易定位問(wèn)題出現的位置,并且通過(guò)本地 /etc/hosts 文件解析 IP 地址速度也會(huì )更快一些。
編輯 /etc/hosts 文件內容均一致,都要將集群中的各 IP 和 主機名對應起來(lái)
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain610.6.3.43 master510.6.3.33 master5210.6.3.48 slave5110.6.3.32 slave5210.6.3.36 slave53當決定使用 DNS 服務(wù)的時(shí)候,還可以通過(guò)如下設置更加精確地控制 HBase 的行為。
如果有多個(gè)網(wǎng)卡,可以通過(guò)參數 hbase.regionserver.dns.interface 指定網(wǎng)卡,該配置參數的默認值是 default ,可以通過(guò)這個(gè)參數指定網(wǎng)絡(luò )接口,不過(guò)要求集群所有節點(diǎn)配置是相同的且每臺主機都使用相同的網(wǎng)卡配置,可以修改這個(gè)配置參數為 eth0 或 eth1 ,這要視具體的硬件配置而定。
另一個(gè)配置是指定 hbase.regionserver.dns,nameserver 可以選擇一個(gè)不同的 DNS 的 nameserver。
4. 本地回環(huán)地址 Loopback IP
HBase 要求將本地回環(huán)接口配置成 127.0.0.1,可以在 /etc/hosts 文件配置,通常系統安裝后都已經(jīng)包含了該配置
127.0.0.1 localhostHBase 要求集群中節點(diǎn)間的系統時(shí)間要基本一致,可以容忍一些偏差,默認相差 30s 以?xún)???梢酝ㄟ^(guò)設置參數 hbase.master.maxclockskew 屬性值修改最大容忍偏差時(shí)間。偏差時(shí)間較多時(shí)集群會(huì )產(chǎn)生一些奇怪的行為。用戶(hù)需要在集群中數據發(fā)生了一些莫名其妙的問(wèn)題,例如讀到的不是剛寫(xiě)進(jìn)集群的數據而是舊數據,這時(shí)就要檢查集群各節點(diǎn)間時(shí)間是否同步。
筆者采用的是在 10.6.3.43 上搭建 NTP 時(shí)間服務(wù)器,集群中其他節點(diǎn)都隨時(shí)與 10.6.3.43 保持時(shí)間同步。關(guān)于 NTP 服務(wù)器的搭建,可以參考:NTP 時(shí)間服務(wù)器實(shí)戰
如果不愿意搭建 NTP 服務(wù)器,可以用腳本實(shí)現在每臺主機上同時(shí)鍵入時(shí)間
date -s "2014-1-4 12:16:00"同時(shí)設置下 hbase.master.maxclockskew 參數,這個(gè)具體請看 附錄
ZooKeeper 是 HBase 集群的 “協(xié)調器” ,負責解決 HMaster 的單點(diǎn)問(wèn)題,以及 root 的路由,所以一個(gè)獨立的 ZooKeeper 服務(wù)時(shí)必需的。要確保事先先安裝好一個(gè) ZooKeeper 集群。具體請參考:ZooKeeper-3.4.5 安裝
以下操作均在主 Master(即 10.6.3.43)上進(jìn)行操作
1. 下載安裝 HBase
不同版本的 HBase 依賴(lài)于特定的 Hadoop 版本,應該選擇最適合的 HBase 版本。筆者使用的 Hadoop-2.5.0-cdh5.3.2,ZooKeeper-3.4.5-cdh5.3.2。故本文所搭建的 HBase 版本為 HBase 0.98.6-cdh5.3.2,下載地址:http://archive.cloudera.com/cdh5/cdh/5/
下載后的 tar.gz 包先暫放在路徑 ~/softwares/tar_packages 下
2. 創(chuàng )建安裝目錄
sudo mkdir -p /usr/local/cluster/hbasesudo chown -R hadoop5:hadoop5 /usr/local/cluster/3. 解壓至安裝目錄下
sudo tar -zxvf ~/softwares/tar_packages/hbase-0.98.6-cdh5.3.2.tar.gz -C /usr/local/cluster/hbase --strip-components 1sudo chown -R hadoop5:hadoop5 /usr/local/cluster/hbase4. 編輯環(huán)境變量并使其生效
Note:這一步在 HBase 集群中的所有節點(diǎn)上都完成
vim ~/.bash_profile添加如下:
export HBASE_HOME=/usr/local/cluster/hbaseexport PATH=$PATH:$HBASE_HOME/bin最后:
source ~/.bash_profile在這個(gè)文件中還可以設置 HBase 的運行環(huán)境,諸如 Heap Size 和 其他有關(guān) JVM 的選項,比如日志保存目錄、進(jìn)程優(yōu)先級等。當然最重要的還是設置 JAVA_HOME 指向 java 安裝的路徑。
cd /usr/local/cluster/hbase/confvim hbase-env.sh添加如下:
export JAVA_HOME=/usr/local/jdk1.8.0_60export HBASE_CLASSPATH=/usr/local/cluster/hadoop/etc/hadoopexport HBASE_HEAPSIZE=4000export HBASE_LOG_DIR=${HBASE_HOME}/logsexport HBASE_MANAGES_ZK=falseJAVA_HOME 和 HBASE_CLASSPATH 根據實(shí)際情況進(jìn)行配置HBASE_HEAPSIZE 的大小根據你的集群配置,默認是 1000HBASE_LOG_DIR 是 HBase 日志存放位置HBASE_MANAGES_ZK=false 含義為 hbase 不托管 zookeeper 的啟動(dòng)與關(guān)閉,因為筆者的 ZooKeeper 是獨立安裝的vim hbase-site.xml注意:接下來(lái)的配置均在兩個(gè) configuration 之間添加完成的,如下圖所示
<property><name>hbase.rootdir</name><value>hdfs://master5:8020/hbase</value></property><property><name>hbase.cluster.distributed</name><value>true</value></property><property><name>hbase.master</name><value>60000</value></property><property><name>hbase.tmp.dir</name><value>/usr/local/cluster/data/hbase-tmp</value></property><property><name>hbase.zookeeper.quorum</name><value>slave51,slave52,slave53</value></property><property><name>hbase.zookeeper.property.dataDir</name><value>/usr/local/cluster/zookeeper/data</value></property><property><name>hbase.zookeeper.property.clientPort</name><value>2181</value></property><property><name>zookeeper.session.timeout</name><value>120000</value></property><property><name>hbase.regionserver.restart.on.zk.expire</name><value>true</value></property>更多配置請參考 :HBase 默認配置
1. hbase.rootdir
這個(gè)目錄是 RegionServer 的共享目錄,用來(lái)持久化 HBase。特別注意的是 hbase.rootdir 里面的 HDFS 地址是要跟 Hadoop 的 core-site.xml 里面的 fs.defaultFS 的 HDFS 的 IP 地址或者域名、端口必須一致。
2. hbase.cluster.distributed
HBase 的運行模式。為 false 表示單機模式,為 true 表示分布式模式。若為 false,HBase 和 ZooKeeper 會(huì )運行在同一個(gè) JVM 中
3. hbase.master
4. hbase.tmp.dir
本地文件系統的臨時(shí)文件夾??梢孕薷牡揭粋€(gè)更為持久的目錄上。(/tmp會(huì )在重啟時(shí)清除)
5. hbase.zookeeper.quorum
對于 ZooKeeper 的配置。至少要在 hbase.zookeeper.quorum 參數中列出全部的 ZooKeeper 的主機,用逗號隔開(kāi)。該屬性值的默認值為 localhost,這個(gè)值顯然不能用于分布式應用中。
6. hbase.zookeeper.property.dataDir
這個(gè)參數用戶(hù)設置 ZooKeeper 快照的存儲位置,默認值為 /tmp,顯然在重啟的時(shí)候會(huì )清空。因為筆者的 ZooKeeper 是獨立安裝的,所以這里路徑是指向了 $ZOOKEEPER_HOME/conf/zoo.cfg 中 dataDir 所設定的位置。
7. hbase.zookeeper.property.clientPort
表示客戶(hù)端連接 ZooKeeper 的端口。
8. zookeeper.session.timeout
ZooKeeper 會(huì )話(huà)超時(shí)。Hbase 把這個(gè)值傳遞改 zk 集群,向它推薦一個(gè)會(huì )話(huà)的最大超時(shí)時(shí)間
9. hbase.regionserver.restart.on.zk.expire
當 regionserver 遇到 ZooKeeper session expired , regionserver 將選擇 restart 而不是 abort。
在這里列出了希望運行的全部 Regionserver ,一行寫(xiě)一個(gè)主機名(就像 Hadoop 中的 slaves 一樣)。這里列出的 Server 會(huì )隨著(zhù)集群的啟動(dòng)而啟動(dòng),集群的停止而停止。
vim regionservers添加如下:
slave51slave52slave53由于 HBase 依賴(lài)于 Hadoop,因此在安裝包的 lib 文件夾下包含了一個(gè) Hadoop 的核心 jar 文件。在分布式模式下,HBase 使用的 Hadoop 版本必須和運行中的 Hadoop 集群的 jar 文件版本一致。將運行的分布式 Hadoop 版本的 jar 文件替換 HBase 的 lib 目錄下的 Hadoop 的 jar 文件,以避免版本不匹配問(wèn)題。確認替換了集群中所有節點(diǎn)的 HBase 安裝目錄下 lib 目錄的 jar 文件。Hadoop 版本不匹配問(wèn)題有不同的表現,但看起來(lái) HBase 像掛掉了。
但因為筆者所用的 HBase 是從 CDH 官網(wǎng)上直接下載配套 Hadoop-2.5.0-cdh5.3.2 版本的,其 lib 包下的已經(jīng)替換了相關(guān)的 jar 包,如下所示:
如果讀者的 hbase 包下并未替換,可以使用如下命令:
cp ${HADOOP_HOME}/share/hadoop/common/hadoop-common-2.5.0-cdh5.3.2.jar ${HBASE_HOME}/lib/cd /usr/local/cluster/hbase/libmv slf4j-log4j12-1.7.5.jar slf4j-log4j12-1.7.5.jar.bak如果不移除的話(huà),將會(huì )出現以下 warning :
scp -r /usr/local/cluster/hbase/ hadoop5@master52:/usr/local/cluster/scp -r /usr/local/cluster/hbase/ hadoop5@slave51:/usr/local/cluster/scp -r /usr/local/cluster/hbase/ hadoop5@slave52:/usr/local/cluster/scp -r /usr/local/cluster/hbase/ hadoop5@slave53:/usr/local/cluster/友情提醒:在啟動(dòng)之前,筆者已經(jīng)將 ZooKeeper 和 Hadoop (至少是 HDFS)給啟動(dòng)了。
1. 在其中一臺主機上啟動(dòng) Hmaster,即筆者在 master5 上,執行以下命令
start-hbase.sh
2. 在另一臺 Hmaster 的主機上,即筆者在 master52 上,執行以下命令
hbase-daemon.sh start master

zkCli.sh
3. 查看相應進(jìn)程
master5

master52

slave53

在 master5 上查看啟動(dòng) HBase 后在 HDFS 上產(chǎn)的目錄。該路徑是由 hbase.rootdir 屬性參數所決定的
hadoop fs -ls -R /hbase
今后 HBase 的數據就是存放在此了。
1. 當 master5 的 HBase 正常工作時(shí)
打開(kāi)瀏覽器可以查看到:
10.6.3.43:60010
2. 模擬 master5 失效后 ,Hmaster 故障切換
hbase-daemon.sh stop master10.6.3.33:60010

補充:關(guān)閉集群
Note:在關(guān)閉之前請確保 ZooKeeper 并沒(méi)有關(guān)閉!
stop-hbase.sh1. 進(jìn)入hbase命令行
hbase shell
2. 建立一個(gè)表,具有三個(gè)列族member_id 、address、info
create 'member','member_id','address','info'
3. 查看當前 HBase 中具有哪些表
list4. 查看表的構造
describe 'member' 5. 刪除列族 member_id
drop 'member'6. 退出 shell 命令行
exit 只要上述操作無(wú)報錯,那么恭喜你,安裝成功!
HBase 和其他的數據庫軟件一樣會(huì )同時(shí)打開(kāi)很多文件。Linux 中默認的 ulimit 值是 1024,這對 HBase 來(lái)說(shuō)太小了。當批量導入數據的時(shí)候會(huì )得到這樣的異常信息: java.io.IOException:Too many open files 。我們需要改變這個(gè)值,注意,這是對操作系統的參數調整,而不是通過(guò) HBase 配置文件來(lái)完成的。我們可以大致估算出 ulimit 值需要配置多大才合適。
存儲文件個(gè)數 * 列族數 * 每個(gè) RegionServer 中的 Region 數量 = RegionServer 主機管理的存儲文件數量假設每個(gè) Region 有 3 個(gè)列族,每個(gè)列族平均有 3 個(gè)存儲文件,每個(gè) RegionServer 有 100 個(gè) region ,將至少需要 3*3*100=900 個(gè)文件。這些存儲文件會(huì )頻繁被客戶(hù)端調用,涉及大量的磁盤(pán)操作,應根據實(shí)際情況調整 ulimit 參數值的大小。
1. 關(guān)于 ulimit 有兩個(gè)地方需要調整,通過(guò)在 /etc/security/limits.conf** 追加參數進(jìn)行設置,一個(gè)參數是 nofile ,設置如下:**
soft nofile 10240hard nofile 10240如果 沒(méi)有設置這個(gè)參數會(huì )得到上面說(shuō)的異常。這個(gè)設置表示限制打開(kāi)的文件數。這個(gè)配置不能及時(shí)生效,還需要通過(guò) ulimit -n 設置。
ulimit -n 102402. 另一個(gè)參數是 noproc,這個(gè)配置是限制用戶(hù)打開(kāi)的進(jìn)程數,設置如下:
soft noproc 10240hard noproc 10240該設置可以及時(shí)生效,可以通過(guò) ulimit -c 查看。如果不設置 noproc 可能會(huì )得到如下異常:
java.lang.OutOfMemoryError:unable to create new native thread實(shí)際上這兩個(gè)參數對于 HDFS 和 MapReduce 也至關(guān)重要,應該在啟動(dòng) Hadoop 之前就設置好。另外注意的是這兩個(gè)參數針對操作系統用戶(hù)的, * 代表對所有用戶(hù)生效。
<property> <name>hbase.master.maxclockskew</name> <value>180000</value> <description>Time difference of regionserver from master</description> </property>參考資料:
聯(lián)系客服