精细调度:Apache DolphinScheduler脚本深度解析

在现代数据处理和工作流管理中,Apache DolphinScheduler以其灵活性和强大的调度能力受到开发者的广泛欢迎。

file

本文将逐步解析DolphinScheduler的关键脚本,希望能提供一个详尽的操作指南,帮助大家掌握安装、配置和操作的每一步。

建立在./bin/env/下目录的配置文件建立好的前提。

安装流程解析

./install.sh
  • 通过source获取install_env.sh和dolphinscheduler_env.sh中的环境变量,如master、worker的基本信息。
  • 在当前机器上创建安装目录,并给目录授权。
  • 向其他节点发送dolphinscheduler的解压文件
  • 停止所有的服务
  • 删除zk上的dolphinscheduler根节点
  • 启动dolphinscheduler所有的服务。

拷贝文件到工作节点

    workDir=`dirname $0`workDir=`cd ${workDir};pwd`source ${workDir}/env/install_env.sh# 获取workers=${workers:-"ds1:default,ds2:default,ds3:default,ds4:default,ds5:default"}# 获取数组workersGroup=(${workers//,/ })# 顺序取数组中的值for workerGroup in ${workersGroup[@]}do# 比如:ds1:defaultecho $workerGroup;# 获取worker的ipworker=`echo $workerGroup|awk -F':' '{print $1}'`# 获取worker对应ip的组,默认为defaultgroup=`echo $workerGroup|awk -F':' '{print $2}'`# 将ip放置到一个集合workerNames+=($worker)# 组放到一个集合groupNames+=(${group:-default})done# 获取需要安装的机器ip: ips=${ips:-"ds1,ds2,ds3,ds4,ds5"}hostsArr=(${ips//,/ })# 开始遍历所有需要安装的机器for host in ${hostsArr[@]}do# 连接目标ip,验证安装目录是否存在,如果不存在,则会进行文件夹的创建,因此,需要事先创建好ssh免密登录if ! ssh -o StrictHostKeyChecking=no -p $sshPort $host test -e $installPath; then# 创建安装目录 比如:/home/dolphinscheduler/apache-dolphinschedulerssh -o StrictHostKeyChecking=no -p $sshPort $host "sudo mkdir -p $installPath; sudo chown -R $deployUser:$deployUser $installPath"fi如果当前机器时server-worker的机器echo "scp dirs to $host/$installPath starting"for i in ${!workerNames[@]}; doif [[ ${workerNames[$i]} == $host ]]; thenworkerIndex=$ibreakfidone# 这里表示用给定的组去替换default这个字符串,不过配置文件中,默认是不存在这个值的,暂时不用管# set worker groups in application.yaml[[ -n ${workerIndex} ]] && sed -i "s/- default/- ${groupNames[$workerIndex]}/" $workDir/../worker-server/conf/application.yaml# 将相关的七个文件都拷贝到安装目录下。for dsDir in bin master-server worker-server alert-server api-server ui toolsdoecho "start to scp $dsDir to $host/$installPath"# Use quiet mode to reduce command line outputscp -q -P $sshPort -r $workDir/../$dsDir  $host:$installPathdone# restore worker groups to default[[ -n ${workerIndex} ]] && sed -i "s/- ${groupNames[$workerIndex]}/- default/" $workDir/../worker-server/conf/application.yamlecho "scp dirs to $host/$installPath complete"done

Zookeeper上根节点的删除

执行命令:

bash ${workDir}/remove-zk-node.sh $zkRoot

具体的脚本细节:

print_usage(){printf $"USAGE:$0 rootNode\n"exit 1
}
# 如果启动参数的个数不等于1,就会报错,
if [ $# -ne 1 ];thenprint_usage
fi
# 获取zk上的rootNode: /dolphinscheduler
rootNode=$1# 获取当前 remove-zk-node.sh 脚本的目录,bin
BIN_DIR=`dirname $0`
BIN_DIR=`cd "$BIN_DIR"; pwd`
# 获取dolphin的根目录,可能是安装目录,可能是包目录
DOLPHINSCHEDULER_HOME=$BIN_DIR/..# 刷新环境变量
source ${BIN_DIR}/env/install_env.sh
source ${BIN_DIR}/env/dolphinscheduler_env.sh# 获取java环境
export JAVA_HOME=$JAVA_HOME# 设置配置文件目录,不过不存在配置文件目录
export DOLPHINSCHEDULER_CONF_DIR=$DOLPHINSCHEDULER_HOME/conf
# 获取需要的lib包
export DOLPHINSCHEDULER_LIB_JARS=$DOLPHINSCHEDULER_HOME/api-server/libs/*# 下面就是具体的执行命令:
export DOLPHINSCHEDULER_OPTS="-Xmx1g -Xms1g -Xss512k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
export STOP_TIMEOUT=5CLASS=org.apache.zookeeper.ZooKeeperMainexec_command="$DOLPHINSCHEDULER_OPTS -classpath $DOLPHINSCHEDULER_CONF_DIR:$DOLPHINSCHEDULER_LIB_JARS $CLASS -server $REGISTRY_ZOOKEEPER_CONNECT_STRING rmr $rootNode"cd $DOLPHINSCHEDULER_HOME
$JAVA_HOME/bin/java $exec_command# 下面来看下这个具体的执行命令是什么?
/bin/java -Xmx1g -Xms1g -Xss512k 
-XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m 
-XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 
# 类路径下的参数
-classpath /conf:/api-server/libs/* 
# 启动的主要类
org.apache.zookeeper.ZooKeeperMain
# 启动的相关参数,这个是zookeeper自身定义的东西,参数需要查看zookeepeer的类
# 主要是zookeeper的连接信息,主要从 dophinscheduler_env.sh 脚本中获取的变量:export REGISTRY_ZOOKEEPER_CONNECT_STRING=${REGISTRY_ZOOKEEPER_CONNECT_STRING:-localhost:2181}
-server localhost:2181 rmr /dolphinscheduler

整体启停流程解析

# 一键开启集群所有服务
bash ./bin/start-all.sh
# 一键关闭集群所有服务
bash ./bin/stop-all.sh

启动过程如下:

  • 通过source获取install_env.sh中的变量,及api-server、master-server、worker-server、alert-server这几个dolphin中节点的基本部署信息。
  • 通过ssh在各个节点上使用 dolphinscheduler-daemon.sh 命令对各个服务做启停。
  • 启停顺序为 master-server、worker-server、alert-server、api-server。
  • 启动时最后会通过 status-all.sh 对各个服务的状态做查询。

节点状态查询解析

根据作者本人所了解的,获取服务的状态一般通过两种方式:

  • 启动服务时,将服务的进程id写入到文件中,通常在/var/run/目录中,当然,也可以自定义目录。
  • 通过ps命令获取对应的进程id。

当然,Apache DolphinScheduler也是通过写进程文件pid的方式来获取进程id来查询服务状态和停止服务的。

如何单节点启停以及状态查询

在海豚调度的整个启动,停止,状态查询中,最终所用到的脚本是 dolphinscheduler-daemon.sh

有时候,因为某种原因,可能导致Apache DolphinScheduler集群中某一个服务挂掉,不可能通过start-all.sh命令来操作所有,同时,在集群各个服务的扩缩容中,也需要单节点启动,因此合理使用该脚本就比较重要。

命令的使用规范:

dolphinscheduler-daemon.sh (start|stop|status) <api-server|master-server|worker-server|alert-server|standalone-server>

脚本解析

dolphinscheduler-daemon.sh 脚本

# 这是一个用法的示例
usage="Usage: dolphinscheduler-daemon.sh (start|stop|status) <api-server|master-server|worker-server|alert-server|standalone-server> "# 携带的参数必须是两个,如果是一个就会报错
# if no args specified, show usage
if [ $# -le 1 ]; thenecho $usageexit 1
fi# 执行的命令
startStop=$1
# shift相当于是将$2 变成$1,
shift
# 执行的任务类型
command=$1
shiftecho "Begin $startStop $command......"BIN_DIR=`dirname $0`
BIN_DIR=`cd "$BIN_DIR"; pwd`
# 获取安装路径的家目录,注意,因为执行的时候,cd 到了installPath
DOLPHINSCHEDULER_HOME=`cd "$BIN_DIR/.."; pwd`
# 获取dolphin的环境变量,为下面的环境变量覆盖做帮助
BIN_ENV_FILE="${DOLPHINSCHEDULER_HOME}/bin/env/dolphinscheduler_env.sh"# 这段话的意思就是使用/bin/env/dolphinscheduler_env.sh配置文件,代替每个服务下配置目录conf下的配置文件
# Overwrite server dolphinscheduler_env.sh in path `<server>/conf/dolphinscheduler_env.sh` when exists
# `bin/env/dolphinscheduler_env.sh` file. User could only change `bin/env/dolphinscheduler_env.sh` instead
# of each server's dolphinscheduler_env.sh when they want to start the server# 定义了一个函数,具体看后面的使用,覆盖环境变量
function overwrite_server_env() {local server=$1local server_env_file="${DOLPHINSCHEDULER_HOME}/${server}/conf/dolphinscheduler_env.sh"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}"elseecho "Start server ${server} using env config path ${server_env_file}, because file ${BIN_ENV_FILE} not exists."fi
}# 当前机器的hostname
export HOSTNAME=`hostname`
# 执行命令服务的日志文件
export DOLPHINSCHEDULER_LOG_DIR=$DOLPHINSCHEDULER_HOME/$command/logs
# 设置超时时间
export STOP_TIMEOUT=5# 创建日志文件夹
if [ ! -d "$DOLPHINSCHEDULER_LOG_DIR" ]; thenmkdir $DOLPHINSCHEDULER_LOG_DIR
fi# 定义服务的启动进程文件
pid=$DOLPHINSCHEDULER_HOME/$command/pid# 进入到服务的主目录
cd $DOLPHINSCHEDULER_HOME/$command
# 服务的运行日志,out日志
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
elseecho "Error: No command named '$command' was found."exit 1
fi# 定义一个函数,获取服务的当前状态
state=""
function get_server_running_status() {state="STOP"if [ -f $pid ]; thenTARGET_PID=`cat $pid`if [[ $(ps -p "$TARGET_PID" -o comm=) =~ "bash" ]]; thenstate="RUNNING"fifi
}# 使用case语句,根据情况做启动,停止,状态查看
case $startStop in(start)# if server is already started, cancel this launch# 如果服务已经启动,直接退出启动过程get_server_running_statusif [[ $state == "RUNNING" ]]; thenecho "$command running as process $TARGET_PID.  Stop it first."exit 1fi# 开始做启动echo starting $command, logging to $DOLPHINSCHEDULER_LOG_DIR# 覆盖配置文件overwrite_server_env "${command}"# 执行具体的命令,输入到日志文件,并将标准输出2重定向到标准输出1nohup /bin/bash "$DOLPHINSCHEDULER_HOME/$command/bin/start.sh" > $log 2>&1 &echo $! > $pid;;# 停止服务,通过kill命令(stop)if [ -f $pid ]; thenTARGET_PID=`cat $pid`if kill -0 $TARGET_PID > /dev/null 2>&1; thenecho stopping $commandpkill -P $TARGET_PIDsleep $STOP_TIMEOUTif 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_PIDfielseecho no $command to stopfirm -f $pidelseecho no $command to stopfi;;# 查询状态(status)get_server_running_statusif [[ $state == "STOP" ]]; then#  font color - redstate="[ \033[1;31m $state \033[0m ]"else# font color - greenstate="[ \033[1;32m $state \033[0m ]"fiecho -e "$command  $state";;(*)echo $usageexit 1;;

启动脚本关键点说明

这里主要讲一点关于env中配置目录中的关键点,可以发现在dolphinscheduler_env.sh中有一些数据库方面的配置。如下:

# Database related configuration, set database type, username and password
export DATABASE=${DATABASE:-postgresql}
export SPRING_PROFILES_ACTIVE=${DATABASE}
export SPRING_DATASOURCE_URL
export SPRING_DATASOURCE_USERNAME
export SPRING_DATASOURCE_PASSWORD

比较了解SpringBoot的同学知道,JAVA的配置一般是来自于Yaml文件中的,因此对于一些初试用的同学对配置可能就比较迷惑。

打开spring的官网: https://docs.spring.io/spring-boot/docs/2.2.9.RELEASE/reference/htmlsingle/#boot-features-external-config, 我们可以看到有这样的描述:

SpringBoot使用一种非常特殊的PropertySource顺序,旨在允许合理地覆盖值。按以下顺序考虑属性:

  • $HOME/.config/spring-boot当 devtools 处于活动状态时,文件夹中的Devtools全局设置属性。
  • @TestPropertySource对你的测试进行注释。
  • properties测试的属性。可用于测试应用程序的特定部分的测试@SpringBootTest注释。
  • 命令行参数。
  • 来自SPRING_APPLICATION_JSON(嵌入环境变量或系统属性中的内联 JSON)的属性。
  • ServletConfig初始化参数。
  • ServletContext初始化参数。
  • JNDI 属性来自java:comp/env.
  • Java 系统属性 ( System.getProperties())。
  • 操作系统环境变量。
  • ARandomValuePropertySource仅在 中具有属性random.*。
  • 打包的 jar(和 YAML 变体)之外的特定于配置文件的应用程序属性application-{profile}.properties。
  • 特定于配置文件的应用程序属性打包在 jar(application-{profile}.properties和 YAML 变体)内。
  • 打包的 jar(和 YAML 变体)之外的应用程序属性application.properties。
  • 打包在 jar 内的应用程序属性application.properties(和 YAML 变体)。
  • @PropertySource类上的注释@Configuration。Environment请注意,在刷新应用程序上下文之前,不会将此类属性源添加到中。现在配置某些属性为时已晚,例如在刷新开始之前读取的logging.和。spring.main.
  • 默认属性(由设置指定SpringApplication.setDefaultProperties)。

其中就有操作系统环境变量,而使用方式就是大写和下划线作为分隔符,具体细节大家看链接的官网就明白了。

通过以上深入的脚本解析,开发者应能更加熟练地操纵Apache DolphinScheduler,从而提升数据工作流的效率和稳定性。随着技术的不断进步,了解并掌握这些基本的脚本操作对于保持技术竞争力是至关重要的。

本文由 白鲸开源科技 提供发布支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精品中国货出海wordpress外贸独立站建站模板

旗袍唐装wordpress外贸网站模板 旗袍、唐装、华服wordpress外贸网站模板&#xff0c;适合做衣服生意的外贸公司官网使用。 https://www.jianzhanpress.com/?p3695 劳动防护wordpress外贸独立站模板 劳动防护wordpress外贸独立站模板&#xff0c;劳动保护、劳动防护用品外贸…

数字创新的风口:创业者如何在Web3时代抢占先机

随着区块链技术的不断发展&#xff0c;Web3正成为数字创新的新风口&#xff0c;为创业者们带来了前所未有的机遇和挑战。本文将从另一个角度探讨Web3对创业者的影响&#xff0c;并提出创业者在Web3时代抢占先机的策略和方法。 1. Web3重新定义了商业模式 Web3不仅仅是一种技术…

无人机生态环境监测、图像处理与GIS数据分析

构建“天空地”一体化监测体系是新形势下生态、环境、水文、农业、林业、气象等资源环境领域的重大需求&#xff0c;无人机生态环境监测在一体化监测体系中扮演着极其重要的角色。通过无人机航空遥感技术可以实现对地表空间要素的立体观测&#xff0c;获取丰富多样的地理空间数…

app逆向-ratel框架-AES,DES,MD5,SHA1加密算法java hook程序

一、前言 AES&#xff08;高级加密标准&#xff09;、DES&#xff08;数据加密标准&#xff09;、MD5&#xff08;消息摘要算法5&#xff09;和SHA-1&#xff08;安全哈希算法1&#xff09;都是常见的加密算法&#xff0c;用于数据加密和哈希计算。 二、加密算法实现 1、创建…

Linux第71步_将linux中的多个文件编译成一个驱动模块

学习目的&#xff1a;采用旧字符设备测试linux系统点灯&#xff0c;进一步熟悉其设计原理。采用多文件参与编译&#xff0c;深度学习编写Makefile&#xff0c;有利于实现驱动模块化设计。 1、创建MyOldLED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home…

14、电源管理入门之Watchdog看门狗

目录 1. 软硬件watchdog的区别 2. 软件看门狗 2.1 kernel watchdog 2.1.1 soft lockup 2.1.1 hard lockup 2.2 用户态watchdog 2.2.1 softdog 2.2.1 hardware watchdog 3. 硬件看门狗 3.1 硬件寄存器介绍 3.2 喂狗操作 3.3 watchdog硬件驱动编写 参考: 看门狗,又…

量化人这样用Jupyter(2) - JupySQL, D-tale

当我们使用 Jupyter 时,很显然我们的主要目的是探索数据。这篇文章将介绍如何利用 JupySQL 来进行数据查询–甚至代替你正在使用的 Navicat, dbeaver 或者 pgAdmin。此外,我们还将介绍如何更敏捷地探索数据,相信这些工具,可以帮你省下 90%的 coding 时间。 原文发表在这里…

excel统计分析——正交设计

参考资料&#xff1a;生物统计学 单因素试验通常采用完全随机设计活动随机区组设计&#xff1b;两因素试验通常采用析因设计&#xff1b;多因素试验不考虑因素间的互作时&#xff0c;可以采用拉丁方设计或正交拉丁方设计&#xff1b;需要考虑因素间的互作时&#xff0c;析因设计…

【Docker】掌握 Docker 镜像操作:从基础到进阶

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在现代软件开发和部署中&#xff0c;容器化技术已经成为不可或缺的一部分。而 Docker 作为最流行的容器化…

JVM工作原理与实战(四十二):JVM常见面试题目

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、JVM常见面试题目 1.请阐述JVM的概念及其核心功能&#xff0c;并简要介绍其组成部分和常用的实现。 2.请阐述Java字节码文件的组成部分。 3.请描述JVM的运行时数据区及其组成部分…

RedTiger‘s Hackit

本文相关的ctf平台链接&#xff1a;RedTigers Hackit (overthewire.org) level 1 这里有个1可以点&#xff0c;先尝试点一下 因为这题是sql注入&#xff0c;cat应该就是注入点了 先判断注入类型 ?cat1 and 11 ?cat1 and 12 数字型注入 再判断列数 1 order by 4 -- 接下来…

Vue深度教程

一、Vue简介 1.简介 2.快速上手 二、基础 1.创建一个Vue应用 2.模板语法 3.响应式基础 4.计算属性 5.Class与 Style绑定 6.条件渲染 7.列表渲染 8.事件处理 9.表单输入绑定 10.生命周期钩子 11.侦听器 12.模板引用 13.组件基础 三、深入组件 1.组件注册 2.Props 3.组件事件 …

css补充(上)

有关字体 1.所有有关字体的样式都会被继承 div {font-size: 30px;}<span>777</span> <div>123<p>456</p> </div>span中777是默认大小16px div设置了30px p作为div的后代继承了字体样式也是30px 2.字体颜色 div{color: red;border: 1px …

【VTKExamples::PolyData】第四十九期 Silhouette

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例Silhouette,并解析接口vtkPolyDataSilhouette,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Silhouett…

RocketMQ架构详解

文章目录 概述RocketMQ架构Broker 高可用集群刷盘策略 概述 RocketMQ一个纯java、分布式、队列模型的开源消息中间件&#xff0c;前身是MetaQ&#xff0c;是阿里研发的一个队列模型的消息中间件&#xff0c;后开源给apache基金会成为了apache的顶级开源项目&#xff0c;具有高…

QT计算两个日期之间的月份数

数据库中单表数据存储量过大时&#xff0c;会造成数据库的查询统计速度变慢&#xff0c;因此需将单表数据拆分存储到按年月命名的多张数据表中。解决思路是获取单表中的最小时间和最大时间&#xff0c;然后计算两个时间中的月份数量&#xff0c;最后根据开始年月循环算出所有需…

软件测试的基本概念

目录 1.测试需求 2.测试用例的概念 3.bug 4.软件生命周期 4.1需求分析 4.2计划 4.3编码 4.4测试 4.5运行维护 5.测试模型 5.1敏捷开发模型 5.2scrume 5.3测试模型 5.4w模型(双v模型) 6.软件测试的生命周期 7.BUG的描述和定义 8.如何定义bug的级别 9.BUG的…

机器学习——线性回归

机器学习——线性回归 文章目录 机器学习——线性回归一、什么是线性回归二、一元线性回归方程三、损失函数四、代码实现五、运用说明 一、什么是线性回归 线性回归是一种用来建立自变量和因变量之间线性关系的统计分析方法&#xff0c;也是机器学习中最常见、最容易理解的一个…

Java面试篇【RabbitMQ】常见面试题(2024最新)

RabbitMQ 1.为什么使用MQ?优点是什么 因为MQ可以异步处理&#xff0c;提高系统吞吐量。 应用解耦&#xff0c;系统之间可以通过消息通信&#xff0c;不关心其他系统的处理。 流量削峰&#xff0c;可以通过消息队列的长度&#xff0c;控制请求量。可以缓解短时间内的高并发请…

无线电信号及其分类

有线与无线通信 通信&#xff1a;指信息的交流与传递。 有线通信&#xff1a;用导向性传输媒体&#xff0c;即信息流沿着固体媒体传播。 例如电报、座机都是沿导线传送信号。 无线通信&#xff1a;用非导向性传输媒体&#xff0c;即在自由空间中被传播。分为红外线、电磁波等…