
通過之前文章的描述,我們已經(jīng)有能力設(shè)計(jì)并部署搭建HBase集群了
當(dāng)我們的HBase集群開始運(yùn)行的時候,新的挑戰(zhàn)又來了
例如,我們可能會遇到在集群運(yùn)行的時候添加或者刪除節(jié)點(diǎn)
又或者需要拷貝/備份整個集群的數(shù)據(jù)等等
如何在集群運(yùn)行的時候以最小的代價來執(zhí)行這些操作呢?
下面總結(jié)一下HBase集群的相關(guān)運(yùn)維和管理知識點(diǎn)
運(yùn)維任務(wù)
添加/刪除節(jié)點(diǎn)
在HBase中動態(tài)添加/刪除節(jié)點(diǎn)非常簡單,只需要一些命令操作即可,HBase會自動幫你處理節(jié)點(diǎn)上下線需要做的事情
添加節(jié)點(diǎn)
1.修改conf目錄下的regionservers文件,將新節(jié)點(diǎn)的主機(jī)名另起一行添加進(jìn)去
2.復(fù)制該文件到集群中的所有機(jī)器
3.啟動該機(jī)器完成節(jié)點(diǎn)的添加
節(jié)點(diǎn)啟動之后會在ZK上注冊創(chuàng)建對應(yīng)的znode, 然后它會加入集群被分配region等
啟動該節(jié)點(diǎn)的方式有兩種:
master節(jié)點(diǎn)上執(zhí)行start-hbase.sh腳本,其會檢查regionservers文件并跳過已經(jīng)啟動的子節(jié)點(diǎn),將其中未啟動的節(jié)點(diǎn)啟動
對應(yīng)的子節(jié)點(diǎn)上執(zhí)行hbase-daemon.sh start regionserver命令,隨后該機(jī)器上的RegionServer服務(wù)啟動
刪除節(jié)點(diǎn)
首先到需要停止運(yùn)行的機(jī)器上執(zhí)行:
hbase-daemon.sh stop regionserver
隨后該節(jié)點(diǎn)關(guān)閉所有region,停止進(jìn)程
ZK中的znode臨時節(jié)點(diǎn)將會過期,master會注意到該region服務(wù)器停止了, 并按照故障處理的流程將該機(jī)器上的所有region重新分配到其他機(jī)器上
下線節(jié)點(diǎn)需要注意兩點(diǎn):
1.如果負(fù)載均衡進(jìn)程正在執(zhí)行,請先停止,因?yàn)槠淇赡軙蚼aster轉(zhuǎn)移region產(chǎn)生競爭
2.如果該節(jié)點(diǎn)上的數(shù)據(jù)量很大,移動region的過程可能很漫長
另外,在HBase0.90.2以上的版本中可以使用graceful_stop.sh hostname來下線節(jié)點(diǎn)
顧名思義,該腳本可以讓節(jié)點(diǎn)的下線過程變得“優(yōu)雅”起來:將region從對應(yīng)的服務(wù)器上一個個移動出來以減少擾動
添加備份master節(jié)點(diǎn)
由于HBase本身并沒有自動提供像HDFS那樣的Namenode雙節(jié)點(diǎn)方案,所以一個潛在的風(fēng)險(xiǎn)就是單點(diǎn)故障問題
但是HBase允許我們手動啟動一個備份的master節(jié)點(diǎn)來避免這個問題
多個master節(jié)點(diǎn)存在的情況下,它們會競爭ZK中專用的znode,第一個競爭到的master來提供服務(wù)
其余的master進(jìn)程只是輪詢檢查這個znode,當(dāng)它消失時再次競爭
我們可以在集群中的另外一臺配置一樣的機(jī)器上啟動備用master:
hbase-daemon.sh start master
從0.90.x版本開始,也可以在conf目錄下的backup-master文件來執(zhí)行備用服務(wù)器
編輯方式和regionservers一樣
該文件中的master會在集群中的主master和regionserver都啟動之后才會啟動
由于master只被設(shè)計(jì)為集群運(yùn)行時的協(xié)調(diào)者,并不占用太多資源
所以啟動多個備用master并沒有什么影響,反而啟動太少可能會留下隱患
建議啟動兩到三個備用master比較合適
數(shù)據(jù)遷移任務(wù)
導(dǎo)入和導(dǎo)出
HBase的jar包中包含了兩個以MapReduce作業(yè)形式來導(dǎo)入導(dǎo)出數(shù)據(jù)的工具
使用方式為:
hadoop jar ${hbase.jar} export ${tablename} ${outputdir}
該工具其余的參數(shù)可以做到增量導(dǎo)出、控制導(dǎo)出的數(shù)據(jù)版本等功能,具體使用請看jar包的幫助信息
導(dǎo)出的數(shù)據(jù)將會存儲在HDFS指定的目錄上,之后可以使用hadoop distcp命令拷貝到其他集群上,并在該集群上進(jìn)行導(dǎo)入操作
需要注意的是,導(dǎo)出的表和導(dǎo)入的表需要有相同的表模式
將export導(dǎo)出的文件數(shù)據(jù)導(dǎo)入到hbase中,使用方式如下:
hadoop jar hbase-server-*.jar import -D <propertyproperty=value>* 表名 生成文件路徑
其中-D后面的參數(shù)包括但不限于為以下幾個
HBASE_IMPORTER_RENAME_CFS:重命名列族,格式為”舊列族名:新列族名”
import.filter.class:指定過濾器類型,在數(shù)據(jù)寫入前進(jìn)行過濾
import.filter.args:指定過濾器之后提供的參數(shù)
import.bulk.output:指定了該參數(shù)之后不會直接寫入數(shù)據(jù),而是生成hfile文件用于bulkload
可能會有人注意到,其實(shí)我們是可以直接使用hadoop distcp命令將HDFS上的hbase根目錄整個拷貝到其他集群中