一文读懂idea如何快速启动DolphinScheduler,本地debug,秒查线上问题(Linux/MacOS)
摘要:接触DS时间也不短了,遇到的问题千奇百怪,啥样的都有,很多问题自己解决,也有很多问题通过官方渠道解决了。但是我们在排查的过程中,光看日志,看源码解决问题实在是过于辛酸。一般我们也会通过启用远程debug的方式去查问题,但是有时候又担心影响线上。所以我们可以选择搭建一套本地DS环境,快速复现并debug定位解决问题,这样对我们理解源码也非常有帮助。前置条件5.7或以上Mysql数据源,并初始化
摘要:
接触DS时间也不短了,遇到的问题千奇百怪,啥样的都有,很多问题自己解决,也有很多问题通过官方渠道解决了。但是我们在排查的过程中,光看日志,看源码解决问题实在是过于辛酸。一般我们也会通过启用远程debug的方式去查问题,但是有时候又担心影响线上。所以我们可以选择搭建一套本地DS环境,快速复现并debug定位解决问题,这样对我们理解源码也非常有帮助。
前置条件
- 5.7或以上Mysql数据源,并初始化DS数据库
- JDK (1.8+) : 本机必装,请安装好后在/etc/profile下配置 JAVA_HOME 及 PATH 变量
- ZooKeeper (3.4.6+)
- node环境,UI界面需要
本地适配修改
配置sudo免密
这一步是因为ds运行时生成的脚本需要执行 sudo -u命令,如果不配置免密的话worker运行会报错。
谨慎操作!因为sudo免密相当于你的当前用户直接拥有root同级权限。最好debug结束后把免密配置注释掉!
# 修改/etc/sudoers文件
sudo vi /etc/sudoers
# 配置sudo免密操作
{youuser} ALL = NOPASSWD: ALL
注释资源校验代码
本机内存比较小的情况建议注释掉资源校验代码,否则容易报下面的错:load is too high or availablePhysicalMemorySize(G) is too low, it's availablePhysicalMemorySize(G):{},loadAvg:{}
需要注释的地方:
org.apache.dolphinscheduler.common.utils.OSUtils#checkResource(double, double)如下注释
public static Boolean checkResource(double systemCpuLoad, double systemReservedMemory){
return true;
// // system load average
// double loadAverage = OSUtils.loadAverage();
// // system available physical memory
// double availablePhysicalMemorySize = OSUtils.availablePhysicalMemorySize();
//
// if(loadAverage > systemCpuLoad || availablePhysicalMemorySize < systemReservedMemory){
// logger.warn("load is too high or availablePhysicalMemorySize(G) is too low, it's availablePhysicalMemorySize(G):{},loadAvg:{}", availablePhysicalMemorySize , loadAverage);
// return false;
// }else{
// return true;
// }
}
HeartBeatTask类里面的资源校验:
// if (availablePhysicalMemorySize < reservedMemory
// || loadAverage > maxCpuloadAvg) {
// logger.info("load is too high or availablePhysicalMemorySize(G) is too low, it's availablePhysicalMemorySize(G):{},loadAvg:{}", availablePhysicalMemorySize, loadAverage);
// status = Constants.ABNORMAL_NODE_STATUS;
// }
数据源修改:
修改dolphinscheduler-dao模块数据源配置文件datasource.properties为自身ds数据源
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://x.x.x.x:3306/ds_1.3.4_dev?characterEncoding=UTF-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=******
Zookeeper配置修改:
修改dolphinscheduler-service模块zk配置文件zookeeper.properties为自身zk
zookeeper.quorum=127.0.0.1:2181
管理后台UI代码修改
为了让ui页面调用本地服务接口,我们需要在运行UI代码前先手动修改dolphinscheduler-ui/.env文件,让UI调用到http://127.0.0.1:12345。
# back end interface address
API_BASE = http://127.0.0.1:12345
控制台打印日志
我们本地调用ds服务需要打开控制台日志输出,便于日志观察,所以需要将所有的logback_*.xml文件的控制台输出打开,主要有以下几个文件:
logback-alert.xml
logback-api.xml
logback-master.xml
logback-worker.xml
修改示例:
<root level="INFO">
<appender-ref ref="TASKLOGFILE"/>
<appender-ref ref="WORKERLOGFILE"/>
<appender-ref ref="STDOUT"/>
</root>
idea增加启动参数
完成代码和配置层面修改之后,我们需要进行VM启动参数进行配置,下面简单介绍一下DS的VM启动参数配置。
VM源文件:dolphinscheduler-daemon.sh
if [ "$command" = "api-server" ]; then
HEAP_INITIAL_SIZE=1g
HEAP_MAX_SIZE=1g
HEAP_NEW_GENERATION__SIZE=500m
LOG_FILE="-Dlogging.config=classpath:logback-api.xml -Dspring.profiles.active=api"
CLASS=org.apache.dolphinscheduler.api.ApiApplicationServer
elif [ "$command" = "master-server" ]; then
HEAP_INITIAL_SIZE=4g
HEAP_MAX_SIZE=4g
HEAP_NEW_GENERATION__SIZE=2g
LOG_FILE="-Dlogging.config=classpath:logback-master.xml -Ddruid.mysql.usePingMethod=false"
CLASS=org.apache.dolphinscheduler.server.master.MasterServer
elif [ "$command" = "worker-server" ]; then
HEAP_INITIAL_SIZE=2g
HEAP_MAX_SIZE=2g
HEAP_NEW_GENERATION__SIZE=1g
LOG_FILE="-Dlogging.config=classpath:logback-worker.xml -Ddruid.mysql.usePingMethod=false"
CLASS=org.apache.dolphinscheduler.server.worker.WorkerServer
elif [ "$command" = "alert-server" ]; then
HEAP_INITIAL_SIZE=1g
HEAP_MAX_SIZE=1g
HEAP_NEW_GENERATION__SIZE=500m
LOG_FILE="-Dlogback.configurationFile=conf/logback-alert.xml"
CLASS=org.apache.dolphinscheduler.alert.AlertServer
elif [ "$command" = "logger-server" ]; then
HEAP_INITIAL_SIZE=1g
HEAP_MAX_SIZE=1g
HEAP_NEW_GENERATION__SIZE=500m
CLASS=org.apache.dolphinscheduler.server.log.LoggerServer
else
echo "Error: No command named \`$command' was found."
exit 1
fi
export DOLPHINSCHEDULER_OPTS="-server -Xms$HEAP_INITIAL_SIZE -Xmx$HEAP_MAX_SIZE -Xmn$HEAP_NEW_GENERATION__SIZE -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xss512k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof"
这里,我们看到每个服务的参数基本上是相同的,部分参数值有不一样而已,最终拼接的结果就是我们需要的,用来配置到IDEA VM参数的值。
下面以api-server为例:-Dlogging.config=classpath:logback-api.xml -Dspring.profiles.active=api -server -Xms1g -Xmx1g -Xmn500m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xss512k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError
启动DS
修改完启动参数,基本上我们就已经准备就绪了,万事具备了。
启动服务
各个服务VM配置好,我们一个个以debug方式start服务。最后通过jps -l命令验证服务是否全部启动(本地排查问题可以根据需要启动,比如说排查api的问题,就可以单独启用api-server服务。一般本地可以不启用logger-server服务)
启动后台页面
服务启动好了之后我们需要启动DS的UI界面,才能正式调通DS。
前置条件:node.js环境
启动步骤:
- 进入项目dolphinscheduler-ui目录,执行npm install安装vue依赖库;
- 执行npm run dev运行UI界面;
ℹ 「wdm」: Compiled successfully.
UI页面运行成功后我们就可以开始结合页面进行具体的debug了
总结
遇到问题要静下心来解决,如果是未知错误,先看日志,日志不明显的话,可以的话用远程debug的方式定位,或者本地复现一下,找到具体出问题的源码位置,然后根据实际情况去解决问题。
附:
远程debug配置:
- 修改bin/dolphinscheduler-daemon.sh文件配置exec_command配置为一下配置:
debug="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
#exec_command="$LOG_FILE $DOLPHINSCHEDULER_OPTS $debug -classpath $DOLPHINSCHEDULER_CONF_DIR:$DOLPHINSCHEDULER_LIB_JARS $CLASS"
exec_command="$LOG_FILE $DOLPHINSCHEDULER_OPTS -classpath $DOLPHINSCHEDULER_CONF_DIR:$DOLPHINSCHEDULER_LIB_JARS $CLASS"
- idea 开启远程debug连接:

更多推荐


所有评论(0)