摘要:

接触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环境
启动步骤:

  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 $CLASS"
  1. idea 开启远程debug连接:
    在这里插入图片描述
Logo

一站式 AI 云服务平台

更多推荐