建網(wǎng)站前期設(shè)計用那軟件花都網(wǎng)絡(luò)推廣seo公司
1.dolphinscheduler的安裝部署
dolphinscheduler服務(wù)的安裝部署都是非常簡單的,因?yàn)榫头?wù)本身而言依賴的服務(wù)并不多。
- mysql / postgresql。由于需要進(jìn)行元數(shù)據(jù)及業(yè)務(wù)數(shù)據(jù)的持久化存儲所以需要依賴于數(shù)據(jù)庫服務(wù),數(shù)據(jù)庫服務(wù)支持mysql、postgresql等, 需要先安裝好數(shù)據(jù)庫服務(wù)。
- zookeeper。同時dolphinscheduler的服務(wù)注冊、發(fā)現(xiàn)、分布式協(xié)調(diào)調(diào)度默認(rèn)采用的是Zookeeper服務(wù)繼續(xù)寧實(shí)現(xiàn)的,所以在安裝服務(wù)之前需要先安裝好zokeeper服務(wù)。
詳細(xì)的安裝部署文檔可以參考我另外一篇博客:dolphinscheduler分布式集群部署指南(小白版)
今天我們不說不提安裝部署, 我們今天來分析一下整個dolphinscheduler服務(wù)一鍵安裝啟動的流程實(shí)現(xiàn), 為什么簡單配置之后就可以把服務(wù)一鍵安裝到服務(wù)器集群上, 然后通過一個start-all.sh腳本以及stop-all.sh腳本就可以控制集群服務(wù)的啟停。
2.dolphinscheduler框架的核心原理
- API 服務(wù):提供外部訪問接口,用戶通過它進(jìn)行工作流管理、任務(wù)編排、調(diào)度和查詢等操作。
- Master 服務(wù):負(fù)責(zé)任務(wù)調(diào)度、分配和監(jiān)控工作流的執(zhí)行,協(xié)調(diào)整個系統(tǒng)的任務(wù)執(zhí)行。
- Worker 服務(wù):具體任務(wù)的執(zhí)行者(真正的牛馬),支持多種任務(wù)執(zhí)行,并將任務(wù)執(zhí)行結(jié)果反饋給 Master 服務(wù)。
- Alert 服務(wù):監(jiān)控系統(tǒng)的健康狀態(tài),并在出現(xiàn)異常時發(fā)出通知警報,確保系統(tǒng)運(yùn)行的穩(wěn)定性和及時處理故障。
3.dolphinscheduler的一鍵安裝啟動實(shí)現(xiàn)
3.1.dolphinscheduler部署包目錄結(jié)構(gòu)
我們從官網(wǎng)下載或者自己本地編譯打包之后的發(fā)布包基本結(jié)構(gòu)如下圖:
在3.2.2版本之前,項(xiàng)目一直都是提供一鍵安裝腳本的, 但是在3.2.2版本之后,好像就沒有這個install.sh腳本, 不知道是不是社區(qū)有意取消的, 有興趣的童鞋可以去社區(qū)群里面咨詢一下,我個人覺得有沒有倒不是特別重要,當(dāng)然有更好。
3.2.2之前的版本,如下圖:
3.2.2版本,如下圖:
3.2.一鍵安裝啟動腳本install.sh
dolphinscheduler的一鍵安裝就是通過這個install.sh
腳本進(jìn)行實(shí)現(xiàn)的。我把腳本里面注釋都刪除了,代碼都增加了注釋,具體的腳本內(nèi)容如下:
# 獲取當(dāng)前工作目錄的絕對路徑并賦值給變量 workDir
workDir=`cd ${workDir};pwd`# 獲取工作目錄的父目錄的絕對路徑并賦值給變量 baseDir
baseDir=`cd ${workDir}/..;pwd`# 加載環(huán)境變量文件(安裝環(huán)境設(shè)置)
# 這個文件中配置了我們需要將api-server/master-server/worker-server/alert-server
# 都要在哪些機(jī)器上面安裝dolphinscheduler以及各個機(jī)器上需要啟動的角色服務(wù)、部署的默認(rèn)用戶、
# 安裝的默認(rèn)基礎(chǔ)目錄、zookeper的根節(jié)點(diǎn)等配置)
source ${workDir}/env/install_env.sh# 加載 dolphinscheduler 的環(huán)境變量文件
source ${workDir}/env/dolphinscheduler_env.sh# 打印日志,說明開始創(chuàng)建目錄
echo "1.create directory"# 檢查安裝路徑是否與當(dāng)前路徑相同(設(shè)置的安裝路徑和執(zhí)行腳本所在的父目錄不能是同一個目錄)
if [ ${baseDir} = $installPath ]; then# 如果安裝路徑與當(dāng)前路徑相同,打印錯誤信息并退出echo "Fatal: The installPath can not be same as the current path: ${installPath}"exit 1
elif [ ! -d $installPath ];then# 如果安裝路徑不存在,創(chuàng)建該目錄并設(shè)置權(quán)限sudo mkdir -p $installPathsudo chown -R $deployUser:$deployUser $installPath
elif [[ -z "${installPath// }" || "${installPath// }" == "/" || ( $(command -v realpath) && $(realpath -s "${installPath}") == "/" ) ]]; then# 如果 installPath 為空、為根路徑("/")或是根路徑的相關(guān)路徑,打印錯誤信息并退出echo "Parameter installPath can not be empty, use in root path or related path of root path, currently use ${installPath}"exit 1
fi# 打印日志,表示開始復(fù)制資源
echo "2.scp resources"# 執(zhí)行 scp-hosts.sh 腳本,將資源拷貝到各個需要部署的服務(wù)器
# 一鍵分布式安裝的核心代碼就在這個scp-hosts.sh腳本中進(jìn)行實(shí)現(xiàn),后面詳細(xì)說明
bash ${workDir}/scp-hosts.sh# 檢查 scp 是否成功,如果失敗則退出
if [ $? -eq 0 ];thenecho 'scp copy completed'
elseecho 'scp copy failed to exit'exit 1
fi# 打印日志,表示開始停止服務(wù)
echo "3.stop server"# 執(zhí)行 stop-all.sh 腳本,停止所有相關(guān)的服務(wù)
bash ${workDir}/stop-all.sh# 打印日志,表示開始刪除 ZooKeeper 節(jié)點(diǎn)
echo "4.delete zk node"# 執(zhí)行 remove-zk-node.sh 腳本,刪除指定的 ZooKeeper 節(jié)點(diǎn)
bash ${workDir}/remove-zk-node.sh $zkRoot# 打印日志,表示開始啟動服務(wù)
echo "5.startup"# 執(zhí)行 start-all.sh 腳本,啟動所有相關(guān)的服務(wù)
bash ${workDir}/start-all.sh
3.3.一鍵安裝核心腳本scp-hosts.sh
在這個腳本中主要就是讀取安裝配置文件中的主機(jī)集群列表,然后將bin、master-server、 worker-server、 alert-server、 api-server、 ui、 tools
這幾個目錄拷貝到集群的各個主機(jī)的對應(yīng)的安裝目錄下,拷貝完成就安裝完畢了。
#!/bin/bash# 獲取當(dāng)前腳本所在的目錄路徑
workDir=`dirname $0`# 獲取該目錄的絕對路徑并賦值給 workDir
workDir=`cd ${workDir};pwd`# 加載安裝環(huán)境配置文件,設(shè)置安裝時所需的環(huán)境變量
source ${workDir}/env/install_env.sh# 將以逗號分隔的 workers 字符串轉(zhuǎn)換為數(shù)組
workersGroup=(${workers//,/ })# 遍歷 workersGroup 數(shù)組,處理每個 worker
for workerGroup in ${workersGroup[@]}
do# 輸出當(dāng)前的 workerGroupecho $workerGroup;# 使用 awk 提取 worker 和 group 的值worker=`echo $workerGroup|awk -F':' '{print $1}'`group=`echo $workerGroup|awk -F':' '{print $2}'`# 將 worker 和 group 添加到對應(yīng)的數(shù)組中workerNames+=($worker)groupNames+=(${group:-default}) # 如果沒有指定 group,默認(rèn)值為 'default'
done# 將以逗號分隔的 ips 字符串轉(zhuǎn)換為數(shù)組
hostsArr=(${ips//,/ })# 遍歷 hostsArr 數(shù)組,處理每個主機(jī)
# 開始往主機(jī)集群上拷貝安裝資源文件
for host in ${hostsArr[@]}
do# 如果遠(yuǎn)程主機(jī)的 $installPath 目錄不存在,則創(chuàng)建該目錄,并設(shè)置目錄的權(quán)限if ! ssh -o StrictHostKeyChecking=no -p $sshPort $host test -e $installPath; thenssh -o StrictHostKeyChecking=no -p $sshPort $host "sudo mkdir -p $installPath; sudo chown -R $deployUser:$deployUser $installPath"fi# 輸出正在將目錄拷貝到目標(biāo)主機(jī)的日志echo "scp dirs to $host/$installPath starting"# 遍歷 workerNames 數(shù)組,找到當(dāng)前主機(jī)對應(yīng)的 worker 索引for i in ${!workerNames[@]}; doif [[ ${workerNames[$i]} == $host ]]; thenworkerIndex=$ibreakfidone# 如果找到了對應(yīng)的 worker 索引,則修改 application.yaml 配置文件中的 worker group# 這行代碼現(xiàn)在基本沒啥用了,配置參數(shù)已移除。[[ -n ${workerIndex} ]] && sed -i "s/- default/- ${groupNames[$workerIndex]}/" $workDir/../worker-server/conf/application.yaml# 拷貝dolphinscheduler的各個目錄到目標(biāo)主機(jī)的安裝路徑# 一鍵分布式安裝的核心就在這里for dsDir in bin master-server worker-server alert-server api-server ui toolsdo# 輸出正在拷貝某個目錄的日志echo "start to scp $dsDir to $host/$installPath"# 使用 quiet 模式減少 scp 輸出scp -q -P $sshPort -r $workDir/../$dsDir $host:$installPathdone# 恢復(fù) application.yaml 中的 worker group 配置為默認(rèn)值[[ -n ${workerIndex} ]] && sed -i "s/- ${groupNames[$workerIndex]}/- default/" $workDir/../worker-server/conf/application.yaml# 輸出拷貝操作完成的日志echo "scp dirs to $host/$installPath complete"
done
3.3.一鍵集群啟動腳本start-all.sh
集群一鍵啟動所有(api-server、master-server、worker-server及alert-server)服務(wù)節(jié)點(diǎn)的入口腳本start-all.sh源碼如下:
#!/bin/bash# 獲取當(dāng)前腳本的目錄路徑,并賦值給 workDir
workDir=`dirname $0`# 轉(zhuǎn)換為絕對路徑,確保后續(xù)引用的路徑是準(zhǔn)確的
workDir=`cd ${workDir};pwd`# 加載環(huán)境配置文件,設(shè)置安裝時所需的環(huán)境變量
# 主要讀取各個服務(wù)角色分別都在集群的那些節(jié)點(diǎn)上進(jìn)行了部署
source ${workDir}/env/install_env.sh# 將以逗號分隔的 workers 字符串轉(zhuǎn)換為數(shù)組,并遍歷每個 worker group
# 讀取所有的worker服務(wù)的啟動節(jié)點(diǎn)列表
workersGroup=(${workers//,/ })
for workerGroup in ${workersGroup[@]}
do# 輸出當(dāng)前的 worker group 信息echo $workerGroup;# 使用 awk 提取 worker 名稱,并將其添加到 workerNames 數(shù)組中worker=`echo $workerGroup|awk -F':' '{print $1}'`workerNames+=($worker)
done# 將以逗號分隔的 masters 字符串轉(zhuǎn)換為數(shù)組,并遍歷每個 master 主機(jī)
# 讀取所有的master服務(wù)的啟動節(jié)點(diǎn)列表
mastersHost=(${masters//,/ })
for master in ${mastersHost[@]}
do# 輸出當(dāng)前 master 主機(jī)正在啟動的信息echo "$master master server is starting"# 通過 SSH 登錄到 master 主機(jī)并啟動 master-server# 實(shí)際上還是調(diào)用了安裝目錄下的bin目錄下的dolphinscheduler-daemon.sh腳本來完成單個api-server/master-server/worker-server/alert-server服務(wù)的啟動、停止及運(yùn)行狀態(tài)查詢ssh -o StrictHostKeyChecking=no -p $sshPort $master "cd $installPath/; bash bin/dolphinscheduler-daemon.sh start master-server;"
done# 遍歷 workerNames 數(shù)組,啟動每個 worker-server
for worker in ${workerNames[@]}
do# 輸出當(dāng)前 worker 主機(jī)正在啟動的信息echo "$worker worker server is starting"# 通過 SSH 登錄到 worker 主機(jī)并啟動 worker-serverssh -o StrictHostKeyChecking=no -p $sshPort $worker "cd $installPath/; bash bin/dolphinscheduler-daemon.sh start worker-server;"
done# 啟動 alert-server
# 通過 SSH 登錄到 alertServer 主機(jī)并啟動 alert-server
ssh -o StrictHostKeyChecking=no -p $sshPort $alertServer "cd $installPath/; bash bin/dolphinscheduler-daemon.sh start alert-server;"# 將以逗號分隔的 apiServers 字符串轉(zhuǎn)換為數(shù)組,并遍歷每個 api server 主機(jī)
apiServersHost=(${apiServers//,/ })
for apiServer in ${apiServersHost[@]}
do# 輸出當(dāng)前 api server 主機(jī)正在啟動的信息echo "$apiServer api server is starting"# 通過 SSH 登錄到 apiServer 主機(jī)并啟動 api-serverssh -o StrictHostKeyChecking=no -p $sshPort $apiServer "cd $installPath/; bash bin/dolphinscheduler-daemon.sh start api-server;"
done# 輸出查詢服務(wù)器狀態(tài)的信息
echo "query server status"# 切換到安裝目錄并執(zhí)行 status-all.sh 腳本,查詢所有服務(wù)器的狀態(tài)
cd $installPath/; bash bin/status-all.sh
通過start-all.sh腳本我們知道了實(shí)際上各個服務(wù)角色的啟動還是調(diào)用了安裝目錄下的bin目錄下的dolphinscheduler-daemon.sh腳本來完成單個api-server/master-server/worker-server/alert-server服務(wù)的啟動、停止及運(yùn)行狀態(tài)查詢
就是安裝目錄的bin目錄下的這個腳本
我們一起看看這個腳本,還是一樣, 我刪除了所有的多余注釋:
#!/bin/bash# 定義腳本的用法說明(幫助信息),包括腳本接收的參數(shù)形式。
usage="Usage: dolphinscheduler-daemon.sh (start|stop|status) <api-server|master-server|worker-server|alert-server|standalone-server> "# 判斷腳本參數(shù)個數(shù)是否小于等于 1,如果是則輸出幫助信息并退出。
if [ $# -le 1 ]; thenecho $usageexit 1
fi# 獲取第一個參數(shù)作為操作類型(start/stop/status),然后將剩下的參數(shù)通過 shift 操作傳遞給后續(xù)變量。
startStop=$1
shift
command=$1
shift# 輸出當(dāng)前操作的信息。
echo "Begin $startStop $command......"# 獲取當(dāng)前腳本所在目錄,并賦值給 BIN_DIR
BIN_DIR=`dirname $0`
# 轉(zhuǎn)換為絕對路徑,確保后續(xù)路徑正確
BIN_DIR=`cd "$BIN_DIR"; pwd`
# 獲取 DolphinScheduler 安裝路徑(上級目錄)
DOLPHINSCHEDULER_HOME=`cd "$BIN_DIR/.."; pwd`
# 設(shè)置 bin 環(huán)境變量配置文件的路徑
BIN_ENV_FILE="${DOLPHINSCHEDULER_HOME}/bin/env/dolphinscheduler_env.sh"# 定義一個函數(shù),負(fù)責(zé)將腳本中的環(huán)境變量配置文件復(fù)制到對應(yīng)服務(wù)的配置文件夾
function overwrite_server_env() {local server=$1# 服務(wù)的環(huán)境變量配置文件路徑local server_env_file="${DOLPHINSCHEDULER_HOME}/${server}/conf/dolphinscheduler_env.sh"# 判斷是否存在 bin 環(huán)境配置文件,如果存在則覆蓋目標(biāo)服務(wù)的配置文件if [ -f "${BIN_ENV_FILE}" ]; thenecho "Overwrite ${server}/conf/dolphinscheduler_env.sh using bin/env/dolphinscheduler_env.sh."cp "${BIN_ENV_FILE}" "${server_env_file}"else# 如果 bin 環(huán)境配置文件不存在,則輸出提示信息,告知使用默認(rèn)配置echo "Start server ${server} using env config path ${server_env_file}, because file ${BIN_ENV_FILE} not exists."fi
}# 獲取當(dāng)前主機(jī)名,并賦值給 HOSTNAME
export HOSTNAME=`hostname`# 定義服務(wù)日志存儲路徑,并根據(jù)操作的服務(wù)(如 api-server、worker-server 等)設(shè)置日志目錄
export DOLPHINSCHEDULER_LOG_DIR=$DOLPHINSCHEDULER_HOME/$command/logs# 設(shè)置服務(wù)停止的最大等待時間(秒)
export STOP_TIMEOUT=5# 如果日志目錄不存在,則創(chuàng)建該目錄
if [ ! -d "$DOLPHINSCHEDULER_LOG_DIR" ]; thenmkdir $DOLPHINSCHEDULER_LOG_DIR
fi# 獲取服務(wù)的 PID 文件路徑
pid=$DOLPHINSCHEDULER_HOME/$command/pid# 切換到相應(yīng)服務(wù)的目錄下
cd $DOLPHINSCHEDULER_HOME/$command# 根據(jù)服務(wù)名稱設(shè)置日志文件路徑
if [ "$command" = "api-server" ]; thenlog=$DOLPHINSCHEDULER_HOME/api-server/logs/$command-$HOSTNAME.out
elif [ "$command" = "master-server" ]; thenlog=$DOLPHINSCHEDULER_HOME/master-server/logs/$command-$HOSTNAME.out
elif [ "$command" = "worker-server" ]; thenlog=$DOLPHINSCHEDULER_HOME/worker-server/logs/$command-$HOSTNAME.out
elif [ "$command" = "alert-server" ]; thenlog=$DOLPHINSCHEDULER_HOME/alert-server/logs/$command-$HOSTNAME.out
elif [ "$command" = "standalone-server" ]; thenlog=$DOLPHINSCHEDULER_HOME/standalone-server/logs/$command-$HOSTNAME.out
else# 如果沒有找到對應(yīng)的服務(wù),則輸出錯誤信息并退出echo "Error: No command named '$command' was found."exit 1
fi# 初始化服務(wù)運(yùn)行狀態(tài)為 "STOP"
state=""# 定義一個函數(shù),用于獲取當(dāng)前服務(wù)的運(yùn)行狀態(tài)
function get_server_running_status() {state="STOP"# 如果存在 PID 文件,則獲取 PID,并判斷對應(yīng)進(jìn)程是否正在運(yùn)行if [ -f $pid ]; thenTARGET_PID=`cat $pid`# 如果目標(biāo)進(jìn)程是 bash 進(jìn)程,則認(rèn)為服務(wù)正在運(yùn)行if [[ $(ps -p "$TARGET_PID" -o comm=) =~ "bash" ]]; thenstate="RUNNING"fifi
}# 根據(jù)傳入的操作類型執(zhí)行對應(yīng)的操作(start、stop、status)
case $startStop in(start)# 獲取服務(wù)的當(dāng)前運(yùn)行狀態(tài)get_server_running_status# 如果服務(wù)已經(jīng)在運(yùn)行,則輸出提示并退出if [[ $state == "RUNNING" ]]; thenecho "$command running as process $TARGET_PID. Stop it first."exit 1fi# 輸出啟動服務(wù)的信息echo starting $command, logging to $DOLPHINSCHEDULER_LOG_DIR# 覆蓋服務(wù)的環(huán)境變量配置overwrite_server_env "${command}"# 啟動服務(wù)的腳本,并將輸出重定向到日志文件nohup /bin/bash "$DOLPHINSCHEDULER_HOME/$command/bin/start.sh" > $log 2>&1 &# 將新啟動的進(jìn)程 PID 保存到 PID 文件echo $! > $pid;;(stop)# 如果 PID 文件存在,則停止服務(wù)if [ -f $pid ]; thenTARGET_PID=`cat $pid`# 判斷進(jìn)程是否存在,如果存在則停止該服務(wù)if kill -0 $TARGET_PID > /dev/null 2>&1; thenecho stopping $command# 殺掉服務(wù)的進(jìn)程pkill -P $TARGET_PIDsleep $STOP_TIMEOUT# 如果服務(wù)在超時時間內(nèi)沒有停止,則強(qiáng)制殺死進(jìn)程if kill -0 $TARGET_PID > /dev/null 2>&1; thenecho "$command did not stop gracefully after $STOP_TIMEOUT seconds: killing with kill -9"pkill -P -9 $TARGET_PIDfielse# 如果 PID 文件中沒有找到對應(yīng)的進(jìn)程,則輸出提示信息echo no $command to stopfi# 刪除 PID 文件rm -f $pidelseecho no $command to stopfi;;(status)# 獲取服務(wù)的運(yùn)行狀態(tài)get_server_running_status# 根據(jù)狀態(tài)輸出不同顏色的提示信息if [[ $state == "STOP" ]]; thenstate="[ \033[1;31m $state \033[0m ]" # 紅色表示停止elsestate="[ \033[1;32m $state \033[0m ]" # 綠色表示運(yùn)行fi# 輸出服務(wù)的狀態(tài)echo -e "$command $state";;(*)# 如果操作類型不匹配,則輸出幫助信息并退出echo $usageexit 1;;esac# 輸出操作完成的信息
echo "End $startStop $command."
總結(jié)一下這個腳本的主要作用:
-
1.將我們在執(zhí)行安裝操作之前設(shè)置的
bin/env/dolphinscheduler_env.sh
環(huán)境變量配置信息同步到各個服務(wù)節(jié)點(diǎn)的conf/dolphinscheduler_env.sh進(jìn)行覆蓋
-
2.給目標(biāo)主機(jī)的目標(biāo)啟動服務(wù)角色目錄下創(chuàng)建日志保存目錄logs
-
3.給目標(biāo)主機(jī)的目標(biāo)啟動服務(wù)角色目錄下創(chuàng)建進(jìn)程ID保存文本文件pid,用于服務(wù)停止時可以找到pid快速停止服務(wù)
-
4.當(dāng)前是啟動服務(wù),會調(diào)用$installPath/服務(wù)角色目錄/bin/start.sh腳本進(jìn)行服務(wù)啟動。
啟動api-server,就會調(diào)用api-server/bin/start.sh
啟動master-server,就會調(diào)用master-server/bin/start.sh
啟動worker-server,就會調(diào)用worker-server/bin/start.sh
啟動alert-server,就會調(diào)用alert-server/bin/start.sh
下面再看看各個角色服務(wù)的啟動腳本,我們就以api-server服務(wù)的start.sh啟動腳本為例來進(jìn)行說明,因?yàn)槲覀兊慕巧?wù)項(xiàng)目基本都是Springboot項(xiàng)目,所以在這個腳本里肯定會以java -jar xxxx.jar
或java -jar -cp jar類路徑 啟動入口類
的方式啟動我們的角色實(shí)例項(xiàng)目,下面我們一起驗(yàn)證一下:
3.4.api-server服務(wù)的啟動腳本
我們?nèi)サ舳嘤嗟淖⑨屝畔?#xff0c; 看看這個啟動腳本start.sh
#!/bin/bash# 獲取腳本所在的目錄,并將其賦值給 BIN_DIR
BIN_DIR=$(dirname $0)# 如果環(huán)境變量 DOLPHINSCHEDULER_HOME 已設(shè)置,則使用該值;否則,自動推算 DOLPHINSCHEDULER_HOME 為腳本所在目錄的上一級路徑
DOLPHINSCHEDULER_HOME=${DOLPHINSCHEDULER_HOME:-$(cd $BIN_DIR/..; pwd)}# 加載配置文件,包含環(huán)境變量和其他配置
source "$DOLPHINSCHEDULER_HOME/conf/dolphinscheduler_env.sh"# 定義 JVM 參數(shù)的環(huán)境變量配置文件路徑
JVM_ARGS_ENV_FILE=${BIN_DIR}/jvm_args_env.sh# 默認(rèn)的 JVM 參數(shù)
JVM_ARGS="-server"# 如果 JVM 參數(shù)文件存在,逐行讀取該文件并解析其中的參數(shù)
if [ -f $JVM_ARGS_ENV_FILE ]; thenwhile read linedo# 如果該行以 '-' 開頭,則認(rèn)為是 JVM 參數(shù)并添加到 JVM_ARGS 中if [[ "$line" == -* ]]; thenJVM_ARGS="${JVM_ARGS} $line"fidone < $JVM_ARGS_ENV_FILE
fi# 如果 JAVA_OPTS 環(huán)境變量未設(shè)置,則使用默認(rèn)的 JVM_ARGS
JAVA_OPTS=${JAVA_OPTS:-"${JVM_ARGS}"}# 如果 DOCKER 環(huán)境變量設(shè)置為 "true",則添加特定的 JVM 參數(shù)
if [[ "$DOCKER" == "true" ]]; thenJAVA_OPTS="${JAVA_OPTS} -XX:-UseContainerSupport"
fi# 輸出 JAVA_HOME 和 JAVA_OPTS 變量的值,用于調(diào)試或驗(yàn)證
echo "JAVA_HOME=${JAVA_HOME}"
echo "JAVA_OPTS=${JAVA_OPTS}"# 使用配置好的 JAVA_HOME 和 JAVA_OPTS 啟動 api-server應(yīng)用,分別指定類路徑和啟動類
$JAVA_HOME/bin/java $JAVA_OPTS -cp "$DOLPHINSCHEDULER_HOME/conf":"$DOLPHINSCHEDULER_HOME/libs/*" org.apache.dolphinscheduler.api.ApiApplicationServer
通過以上腳本最終生成的api-server的啟動命令示例如下:
/usr/local/jdk1.8.0_202/bin/java \
-server -Duser.timezone=GMT+8 -Xms2g -Xmx2g -Xmn512m \
-XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof \
-cp /opt/bigdata/dolphinscheduler/ds/api-server/conf:/opt/bigdata/dolphinscheduler/ds/api-server/libs/* \
org.apache.dolphinscheduler.api.ApiApplicationServer
這個啟動腳本做了一下幾件事情:
- 1.生效當(dāng)前角色服務(wù)目錄的conf目錄下dolphinscheduler_env.sh文件中的系統(tǒng)環(huán)境變量配置信息
- 2.將start.sh同目錄下的jvm_args_env.sh中定義的JVM啟動參數(shù)項(xiàng)讀取出來 組裝到$JAVA_OPTS變量中,
- 3.組裝好api-server服務(wù)的啟動命令并執(zhí)行啟動。
按照這個邏輯我們應(yīng)該就可以推理出其他的角色服務(wù)的啟動流程基本都是相同的, 存在的不同的主要就是在于:
- 1.JVM啟動參數(shù)的設(shè)置可能會不同
- 2.服務(wù)啟動的java入口主類肯定會根據(jù)對應(yīng)的服務(wù)角色啟動對應(yīng)的主類
3.4.master-server服務(wù)的啟動腳本
驗(yàn)證一下master-server啟動腳本中的主入口類
3.5.worker-server服務(wù)的啟動腳本
驗(yàn)證一下worker-server啟動腳本中的主入口類
3.6.alert-server服務(wù)的啟動腳本
驗(yàn)證一下alert-server啟動腳本中的主入口類
4.總結(jié)
通過以上分析我們基本梳理清楚了整個dolphinscheduler項(xiàng)目的一鍵安裝啟動邏輯, 我們現(xiàn)在在通過一張圖正好理一下整個實(shí)現(xiàn)流程。
關(guān)于一鍵停止集群服務(wù)及一件查詢集群各個角色服務(wù)實(shí)例運(yùn)行狀態(tài)的實(shí)現(xiàn)也都在stop-all.sh/status-all.sh及dolphinscheduler-daemon.sh這三個腳本中, 有興趣自行研究。
寫這篇文章的核心目的不僅在于給大家分享如何優(yōu)秀的開源項(xiàng)目的一鍵安裝部署的實(shí)現(xiàn)過程,更想要
的是能啟發(fā)大家的思路,能夠?qū)⑽覀儚倪@中間學(xué)習(xí)到的好的方法和思想運(yùn)用到我們實(shí)際的項(xiàng)目,有些東西理解啟動其實(shí)挺容易的, 運(yùn)用,舉一反三對大多數(shù)人來說還是很難的,希望大家看完都能有所收獲,如果覺得文章寫的還不錯,喜歡的童鞋們請點(diǎn)贊收藏,送你一朵小紅花哈~~~~~~