⼀⽂读懂idea如何快速启动DolphinScheduler,本地debug,秒查线上问题。。
摘要:
idea debug接触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.dolphinschedulermon.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:{}", availablePhysicalMem orySize , 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:{}", availablePhysical MemorySize, loadAverage);
//                status = Constants.ABNORMAL_NODE_STATUS;
//            }
数据源修改:
修改dolphinscheduler-dao模块数据源配置⽂件datasource.properties为⾃⾝ds数据源
spring.datasource.sql.jdbc.Driver
spring.datasource.url=jdbc:mysql://: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代码修改
# back end interface address
API_BASE = 127.0.0.1:12345
控制台打印⽇志
我们本地调⽤ds服务需要打开控制台⽇志输出,便于⽇志观察,所以需要将所有的logback_*.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="-fig=l -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="-fig=l -sql.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="-fig=l -sql.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="-figurationFile=l"
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:Metasp aceSize=128m -XX:MaxMetaspaceSize=128m  -Xss512k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:Large PageSizeInBytes=128m -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDu mpOnOutOfMemoryError  -XX:HeapDumpPath=dump.hprof"
这⾥,我们看到每个服务的参数基本上是相同的,部分参数值有不⼀样⽽已,最终拼接的结果就是我们需要的,⽤来配置到IDEA VM参数的值。
下⾯以api-server为例:
-fig=l -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环境
启动步骤:
1. 进⼊项⽬dolphinscheduler-ui⽬录,执⾏npm install安装vue依赖库;
2. 执⾏npm run dev运⾏UI界⾯;
ℹ  wdm : Compiled successfully.
UI页⾯运⾏成功后我们就可以开始结合页⾯进⾏具体的debug了
总结
遇到问题要静下⼼来解决,如果是未知错误,先看⽇志,⽇志不明显的话,可以的话⽤远程debug的⽅式定位,或者本地复现⼀下,到具体出问题的源码位置,然后根据实际情况去解决问题。
附:
远程debug配置:
1. 修改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 $CL ASS"
2. idea 开启远程debug连接: