[shell script] 重新啟動 hbase 叢集

對於hbase而言, 若是發生無法挽救的錯誤,
導致需要重新啟動hbase叢集, 一直以來都是麻煩的事情...
尤其, 這還牽涉到HDFS的資料同步,
因此, 若是要重新格式化hbase叢集需要經過以下步驟:
1. 關閉hbase (注意HMaster, 可能會沒有回應...)
2. 關閉hadoop
3. 清除各節點上hbase和hadoop的資料
4. 格式化hadoop namenode
5. 啟動hadoop
6. 啟動hbase

由於目前所使用的雲端環境不是非常穩定,
有時會所有虛擬機同時重新啟動, 導致hbase叢集也必須重啟...
因此, 我在hbase master節點上寫了一支shell script,
把重啟hbase叢集自動化執行

以下是一些環境變數:
hbase 叢集節點: hbasemaster, hbaseslave01, hbaseslave02
HDFS資料儲存位置: /opt/data
hadoop log儲存位置: /opt/hadoop/logs
hbase資料暫存位置: /opt/hbase/hbase-data
hbase資料暫存位置: /opt/hbase/hbase-logs
安裝hadoop和hbase的權限: hduser
(這些變數的設定請參考hadoop和hbase的安裝)

以下是shell script檔 (restart_hbase.sh):

#!/bin/bash
# Program:
#       This program restarts hbase cluster.
# History:
# 2015/06/11     Chun-Hsien Ko     First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

pid=$(su - hduser -c "cat /opt/hbase/hbase-pids/hbase-hduser-master.pid")
echo $pid
kill -9 $pid

su - hduser -c "/opt/hbase/bin/stop-hbase.sh"
sleep 10
su - hduser -c "/opt/hadoop/bin/stop-all.sh"
sleep 10

su - hduser -c "ssh hduser@hbasemaster rm -r /opt/data"
su - hduser -c "ssh hduser@hbasemaster rm -r /opt/hadoop/logs"
su - hduser -c "ssh hduser@hbasemaster rm -r /opt/hbase/hbase-logs"
su - hduser -c "ssh hduser@hbasemaster rm -r /opt/hbase/hbase-data"

su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/data"
su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/hadoop/logs"
su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/hbase/hbase-logs"
su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/hbase/hbase-data"

su - hduser -c "ssh hduser@hbaseslave02 rm -r /opt/data"
su - hduser -c "ssh hduser@hbaseslave02 rm -r /opt/hadoop/logs"
su - hduser -c "ssh hduser@hbaseslave02 rm -r /opt/hbase/hbase-logs"
su - hduser -c "ssh hduser@hbaseslave02 rm -r /opt/hbase/hbase-data"

su - hduser -c "/opt/hadoop/bin/hadoop namenode -format"
sleep 10
su - hduser -c "/opt/hadoop/bin/start-all.sh"
sleep 10
su - hduser -c "/opt/hbase/bin/start-hbase.sh"
su - hduser -c "/opt/hbase/bin/hbase-daemon.sh start thrift"

以下是程式的解說

pid=$(su - hduser -c "cat /opt/hbase/hbase-pids/hbase-hduser-master.pid")
echo $pid
kill -9 $pid

su - hduser -c "/opt/hbase/bin/stop-hbase.sh"
sleep 10
su - hduser -c "/opt/hadoop/bin/stop-all.sh"
sleep 10

在一開始, 為了避免使用stop-hbase.sh時, HMaster沒有回應,
因此, 先去讀取HMaster的PID, 將此程式結束,
接著, 執行stop-hbase.sh和/opt/hadoop/bin/stop-all.sh兩支腳本,
關閉hbase和hadoop的程式.

接著, 我們把暫存的資料和log都清除,
由於資料分散在各節點上, 所以, 我們用SSH的方式到各節點上清除:

su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/data"
su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/hadoop/logs"
su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/hbase/hbase-logs"
su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/hbase/hbase-data"

由於資料已經清除了, 我們要重新格式化 namenode,
取得一個新的HDFS ID, 否則會有版本不一致的問題,

su - hduser -c "/opt/hadoop/bin/hadoop namenode -format"

完成後, 執行 start-all.sh, start-hbase.sh 以及 hbase-daemon.sh start thrift,
啟動hadoop, hbase以及thrift server.

su - hduser -c "/opt/hadoop/bin/start-all.sh"
sleep 10
su - hduser -c "/opt/hbase/bin/start-hbase.sh"
su - hduser -c "/opt/hbase/bin/hbase-daemon.sh start thrift"

在撰寫這一支 shell script 時,
我特別使用 root (sudo) 的權限撰寫,
所以, 執行時指令為: sudo sh restart_hbase.sh

這樣的好處是, 你可以在 shell script 內切換權限,
進行各式各樣的操作(比如說讀取 /etc/hosts 的內容)
缺點就是, 執行 hadoop 和 hbase 的程式就必須不斷切換權限 (hduser),
其中的取捨, 大家可以自己評估對此工具的需求.

更新!!
由於 stop-hbase.sh 並不會關閉 region server,
因此需要手動關閉, 否則 HMaster 在分配 -root- 表時,
會找不到可用的 region server, 重複在初始 HMaster 的狀態,
因此我們可以再刪除資料的地方加入:
pid=$(su - hduser -c "ssh hduser@hbaseslave01 cat /opt/hbase/hbase-pids/hbase-hduser-regionserver.pid")
su - hduser -c "ssh hduser@hbaseslave01 kill -9 $pid"

讀取 region server 的 PID, 並強制關閉程序,
或者是, 也可以使用 /opt/hbase/bin/hbase-daemon.sh stop regionserver,
但是, 有時候會陷入等待的狀態...

經過修改後, 所有的程式碼如下:

#!/bin/bash
# Program:
#       This program restarts hbase cluster.
# History:
# 2015/06/11     Chun-Hsien Ko     First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

pid=$(su - hduser -c "cat /opt/hbase/hbase-pids/hbase-hduser-master.pid")
echo $pid
kill -9 $pid

su - hduser -c "/opt/hbase/bin/hbase-daemon.sh stop thrift"

su - hduser -c "/opt/hbase/bin/stop-hbase.sh"
sleep 10
su - hduser -c "/opt/hadoop/bin/stop-all.sh"
sleep 10

su - hduser -c "ssh hduser@hbasemaster rm -r /opt/data"
su - hduser -c "ssh hduser@hbasemaster rm -r /opt/hadoop/logs"
su - hduser -c "ssh hduser@hbasemaster rm -r /opt/hbase/hbase-logs"
su - hduser -c "ssh hduser@hbasemaster rm -r /opt/hbase/hbase-data"
pid=$(su - hduser -c "ssh hduser@hbasemaster cat /opt/hbase/hbase-pids/hbase-hduser-regionserver.pid")
su - hduser -c "ssh hduser@hbasemaster kill -9 $pid"

su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/data"
su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/hadoop/logs"
su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/hbase/hbase-logs"
su - hduser -c "ssh hduser@hbaseslave01 rm -r /opt/hbase/hbase-data"
pid=$(su - hduser -c "ssh hduser@hbaseslave01 cat /opt/hbase/hbase-pids/hbase-hduser-regionserver.pid")
su - hduser -c "ssh hduser@hbaseslave01 kill -9 $pid"

su - hduser -c "ssh hduser@hbaseslave02 rm -r /opt/data"
su - hduser -c "ssh hduser@hbaseslave02 rm -r /opt/hadoop/logs"
su - hduser -c "ssh hduser@hbaseslave02 rm -r /opt/hbase/hbase-logs"
su - hduser -c "ssh hduser@hbaseslave02 rm -r /opt/hbase/hbase-data"
pid=$(su - hduser -c "ssh hduser@hbaseslave02 cat /opt/hbase/hbase-pids/hbase-hduser-regionserver.pid")
su - hduser -c "ssh hduser@hbaseslave02 kill -9 $pid"

su - hduser -c "/opt/hadoop/bin/hadoop namenode -format"
sleep 10
su - hduser -c "/opt/hadoop/bin/start-all.sh"
sleep 10
su - hduser -c "/opt/hbase/bin/start-hbase.sh"
su - hduser -c "/opt/hbase/bin/hbase-daemon.sh start thrift"


留言

熱門文章

LTE筆記: RSRP, RSSI and RSRQ

[WiFi] WiFi 網路的識別: BSS, ESS, SSID, ESSID, BSSID

LTE筆記: 波束成型 (beamforming) 和天線陣列