一、腳本命令
- nohup: 放在命令開頭,表示不掛起,也就是關閉終端進程也繼續保持運行狀態 ;
- /dev/null:是Linux文件系統中的一個文件,被稱為黑洞,所有寫入改文件的內容都會被自動丟棄 ;
- 2>&1 : 表示將錯誤重定向到標准輸出上;
- &: 放在命令結尾,表示后台運行;
- 一般會組合使用: nohup [xxx命令操作]> file 2>&1 &,表示將xxx命令運行的結果輸出到file中,並保持命令啟動的進程在后台運行。
二、腳本
前台啟動的方式導致需要打開多個shell窗口,可以使用如下方式后台方式啟動:
#!/bin/bash HIVE_LOG_DIR=$HIVE_HOME/logs
#如果 $HIVE_LOG_DIR 不是文件目錄,則新建一個存放日志的文件夾
if [ ! -d $HIVE_LOG_DIR ]
then
mkdir -p $HIVE_LOG_DIR
fi
#檢查進程是否運行正常,參數1為進程名,參數2為進程端口 function check_process() { pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}') ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1) echo $pid [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1 } function hive_start() { metapid=$(check_process HiveMetastore 9083) cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &" cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 2>&1" [ -z "$metapid" ] && eval $cmd || echo "Metastroe服務已啟動" server2pid=$(check_process HiveServer2 10000) cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &" [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服務已啟動" } function hive_stop() { metapid=$(check_process HiveMetastore 9083) [ "$metapid" ] && kill $metapid || echo "Metastore服務未啟動" server2pid=$(check_process HiveServer2 10000) [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服務未啟動" } case $1 in "start") hive_start ;; "stop") hive_stop ;; "restart") hive_stop sleep 2 hive_start ;; "status") check_process HiveMetastore 9083 >/dev/null && echo "Metastore服務運行正常" || echo "Metastore服務運行異常" check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服務運行正常" || echo "HiveServer2服務運行異常" ;; *) echo Invalid Args! echo 'Usage: '$(basename $0)' start|stop|restart|status' ;; esac
添加執行權限:
$ chmod +x $HIVE_HOME/bin/hiveservices.sh
啟動Hive后台服務 (測試腳本):
$ hiveservices.sh start
此時,可以注釋掉hive-site.xml中的以下內容:
<!-- 指定存儲元數據要連接的地址 --> <!-- <property> <name>hive.metastore.uris</name> <value>thrift://node01:9083</value> </property> --> <!-- 指定hiveserver2連接的host --> <!-- <property> <name>hive.server2.thrift.bind.host</name> <value>192.168.71.128</value> </property> --> <!-- 指定 hiveserver2 連接的端口號 --> <!-- <property> <name>hive.server2.thrift.port</name> <value>10000</value> </property> -->
使用beeline連接
beeline> !connect jdbc:hive2://master:10000