dolphinscheduler配置之 master.properties/worker.properties及常见问题学习

master.properties

# master execute thread num
master.exec.threads=50

# master execute task number in parallel
master.exec.task.num=20


# master dispatch task number
master.dispatch.task.num = 3

# master heartbeat interval
#master.heartbeat.interval=10

# master commit task retry times
master.task.commit.retryTimes=5

# master commit task interval
master.task.commit.interval=1000


# only less than cpu avg load, master server can work.  default value -1 : the number of cpu cores * 2
#master.max.cpuload.avg=-1

# only larger than reserved memory, master server can work. default value : physical memory * 1/10, unit is G.
#master.reserved.memory=0.3

# master listen port
#master.listen.port=5678
 

worker.properties


# worker execute thread num
#worker.exec.threads=100

# worker heartbeat interval
#worker.heartbeat.interval=10

# only less than cpu avg load, worker server can work. default value -1: the number of cpu cores * 2
#worker.max.cpuload.avg= -1

# only larger than reserved memory, worker server can work. default value : physical memory * 1/6, unit is G.
#worker.reserved.memory=0.3

# worker listener port
#worker.listen.port: 1234

# default worker.group=default
worker.groups=worker01,default,node13

 

 我的电脑是 12核 32g 打印如下

 

# only less than cpu avg load, master server can work.  default value -1 : the number of cpu cores * 2
#master.max.cpuload.avg=-1

# only larger than reserved memory, master server can work. default value : physical memory * 1/10, unit is G.
#master.reserved.memory=0.3

这个配置=-1是什么意思呢?

默认-1 我们可以看到 master.max.cpuload.avg=default_maste_cpu_load=cpu_cores*2 

master.reserved.memory=0.3 其实就为系统预留了3G内存,意思是给其他应用留点活路。

以我们的机器为例 32G 12线程

/**
 * master cpu load
 */
public static final int DEFAULT_MASTER_CPU_LOAD = Runtime.getRuntime().availableProcessors() * 2;

/**
 * master reserved memory
 */
public static final double DEFAULT_MASTER_RESERVED_MEMORY = OSUtils.totalMemorySize() / 10;

 

我们看下哪里用到了这两个参数 此时以服务器为例128G 32core

 

/**
 * whether can submit task to queue
 * @return boolean
 */
private boolean canSubmitTaskToQueue() {     
        -- 前面的应该就是满cpu=32*2=64
    return OSUtils.checkResource(masterConfig.getMasterMaxCpuloadAvg(),
  --这个是预留的=0.3  其实就是3G(我不知道dolphin为啥要/10)
 masterConfig.getMasterReservedMemory());
}
/**
 * check memory and cpu usage
 * @param systemCpuLoad systemCpuLoad
 * @param systemReservedMemory systemReservedMemory
 * @return check memory and cpu usage
 */                                          64             0.3
public static Boolean checkResource(double systemCpuLoad, double systemReservedMemory){
  // system load average  //这个load 我本地跑了下是-1 可能是我啥也没干
  double loadAverage = OSUtils.loadAverage();
  // system available physical memory 注意这里啊没有/10 比如这里系统还有60G内存=60
  double availablePhysicalMemorySize = OSUtils.availablePhysicalMemorySize();
                     64                 60G <0.3 注意这里什么情况下会小于0.3呢??
  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;
  }
}

看打印的日志 

我们的服务器是32核 128G 所以maxCPU=32*2=64 128/10=12.8 

load is too high or availablePhysicalMemorySize(G) is too low, it's availablePhysicalMemorySize(G):64.47,loadAvg:66.73 

 你看日志预警是为啥 可用内存是64G 那肯定不是内存的锅。 loadAvg=66 >systemCpuLoad=64

所以报错。

所以这里有个问题 就是cpu如果没跑满比如cpu=20 但是实际内存只有2G了 按道理应该是要预警的。但是不会 因为2 >0.3 所以这里是不是有问题呢?

因为我用的是老版本dolphin所以我专门查看了一下 3.0的dolphin 发现确实没有/10这个说法了。。

 

 无所谓了。 不管是0.3还是3G 反正就是一个预留值。

由此我们可以推断出什么呢?

我们为了让调度更好的运行 例如机器128G  32核

我们可以设置

master.max.cpuload.avg=63

master.reserved.memory=3   这个就是3G.

当然你不设置也无所谓了,都够用 只是你要明白这些参数是做什么的。

master.properties
设置 master 节点并发执行的最大工作流数
master.exec.threads=100

Control the number of parallel tasks in each workflow
设置每个工作流可以并发执行的最大任务数
master.exec.task.number=20

worker.properties
设置 worker 节点并发执行的最大任务数
worker.exec.threads=100

突然发现有文档。就不想研究了。

dolphinscheduler/faq.md at dev · apache/dolphinscheduler · GitHub

抄下文档的一些重要内容

Q:Master 或者 Worker 报如下告警

修改 conf 下的 master.properties master.reserved.memory 的值为更小的值,比如说 0.1 或者

worker.properties worker.reserved.memory 的值为更小的值,比如说 0.1

 其实就是一点活路也不留了。。

Q:工作流模板 DAG、工作流实例、工作任务及实例之间是什么关系 工作流模板 DAG、工作流实例、工作任务及实例之间是什么关系,一个 dag 支持最大并发 100,是指产生 100 个工作流实例并发运行吗?一个 dag 中的任务节点,也有并发数的配置,是指任务也可以并发多个线程运行吗?最大数 100 吗?

  master.properties
   设置 master 节点并发执行的最大工作流数
   master.exec.threads=100

   Control the number of parallel tasks in each workflow
   设置每个工作流可以并发执行的最大任务数
   master.exec.task.number=20

   worker.properties
   设置 worker 节点并发执行的最大任务数
   worker.exec.threads=100

这个注意了。其中master/worker.exec.threads=100 指的是该节点同时支持100个任务。比如我2

台worker 1台master 同时理想情况下支持300个任务。

master.exec.task.number=20 这个指的一个工作流同时只能只能运行20个。因为往往一个工作流可能会有几十 甚至上百个任务。

Q:Master 服务和 Worker 服务在运行几天之后停止了

会话超时时间太短了,只有 0.3 秒,修改 zookeeper.properties 的配置项:

zookeeper.session.timeout=60000
zookeeper.connection.timeout=30000

 Q:zk 中注册的 master 信息 ip 地址是 127.0.0.1,而不是配置的域名所对应或者解析的 ip 地址,可能导致不能查看任务日志

1、confirm hostname
$hostname
hadoop1
2、hostname -i
127.0.0.1 10.3.57.15
3、edit /etc/hosts,delete hadoop1 from 127.0.0.1 record
$cat /etc/hosts
127.0.0.1 localhost
10.3.57.15 ds1 hadoop1
4、hostname -i
10.3.57.15

hostname 命令返回服务器主机名,hostname -i 返回的是服务器主机名在 /etc/hosts 中所有匹配的 ip 地址。所以我把 /etc/hosts 中 127.0.0.1 中的主机名删掉,只保留内网 ip 的解析就可以了,没必要把 127.0.0.1 整条注释掉, 只要 hostname 命令返回值在 /etc/hosts 中对应的内网 ip 正确就可以,ds 程序取了第一个值,我理解上 ds 程序不应该用 hostname -i 取值这样有点问题,因为好多公司服务器的主机名都是运维配置的,感觉还是直接取配置文件的域名解析的返回 ip 更准确,或者 znode 中存域名信息而不是 /etc/hosts。

Q:当使用 mysql 作为 ds 数据库需要如何配置

A:1,修改项目根目录 maven 配置文件,移除 scope 的 test 属性,这样 mysql 的包就可以在其它阶段被加载

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>${mysql.connector.version}</version>
	<scope>test<scope>
</dependency>

​ 2,修改 application-dao.properties 和 quzrtz.properties 来使用 mysql 驱动 默认驱动是 postgres 主要由于许可证原因。

 Q:shell 任务是如何运行的

A:1,被执行的服务器在哪里配置,以及实际执行的服务器是哪台? 要指定在某个 worker 上去执行,可以在 worker 分组中配置,固定 IP,这样就可以把路径写死。如果配置的 worker 分组有多个 worker,实际执行的服务器由调度决定的,具有随机性。

​ 2,如果是服务器上某个路径的一个 shell 文件,怎么指向这个路径?服务器上某个路径下的 shell 文件,涉及到权限问题,不建议这么做。建议你可以使用资源中心的存储功能,然后在 shell 编辑器里面使用资源引用就可以,系统会帮助你把脚本下载到执行目录下。如果以 hdfs 作为资源中心,在执行的时候,调度器会把依赖的 jar 包,文件等资源拉到 worker 的执行目录上,我这边是 /tmp/escheduler/exec/process,该配置可以在 install.sh 中进行指定。

3,以哪个用户来执行任务?执行任务的时候,调度器会采用 sudo -u 租户的方式去执行,租户是一个 linux 用户。

Q:生产环境部署方式有推荐的最佳实践吗

A:1,如果没有很多任务要运行,出于稳定性考虑我们建议使用 3 个节点,并且最好把 Master/Worder 服务部署在不同的节点。如果你只有一个节点,当然只能把所有的服务部署在同一个节点!通常来说,需要多少节点取决于你的业务,海豚调度系统本身不需要很多的资源。充分测试之后,你们将找到使用较少节点的合适的部署方式

这里我说下 我看到我们的生产开发环境 都部署错了!!! 我们在master的机器也部署了worker了。 其实 master也可以看作一台worker。但是木已成舟,算球吧。

为什么不能这么做。 因为比如上面的worker task=100 master task=100 那你这台机器就可以跑150个task。

Q:dolphin上传比较大的文件卡住

A:1,编辑 ngnix 配置文件 vi /etc/nginx/nginx.conf,更改上传大小 client_max_body_size 1024m。

​ 2,更新 google chrome 版本到最新版本。

dolphinscheduler 在运行过程中,ip 地址获取错误的问题

master 服务、worker 服务在 zookeeper 注册时,会以 ip:port 的形式创建相关信息如果 ip 地址获取错误,请检查网络信息,如 Linux 系统通过 ifconfig 命令查看网络信息,

可以使用 dolphinscheduler 提供的三种策略,获取可用 ip:

  • default: 优先获取内网网卡获取 ip 地址,其次获取外网网卡获取 ip 地址,在前两项失效情况下,使用第一块可用网卡的地址
  • inner: 使用内网网卡获取 ip 地址,如果获取失败抛出异常信息
  • outer: 使用外网网卡获取 ip 地址,如果获取失败抛出异常信息

配置方式是在 common.properties 中修改相关配置:

# network IP gets priority, default: inner outer
# dolphin.scheduler.network.priority.strategy=default

另外,如果希望从指定的网卡获取 ip 地址,配置方式是在 common.properties 中设置配置项 dolphin.scheduler.network.interface.preferred。例如,如果希望从网卡 eth1 获取 ip 地址,配置方式是:

dolphin.scheduler.network.interface.preferred=eth1

以上配置修改后重启服务生效

如果 ip 地址获取依然错误,请下载 dolphinscheduler-netutils.jar 到相应机器,执行以下命令以进一步排障,并反馈给社区开发人员:

java -jar target/dolphinscheduler-netutils.jar

配置 sudo 免密,用于解决默认配置 sudo 权限过大或不能申请 root 权限的使用问题

配置 dolphinscheduler OS 账号的 sudo 权限为部分普通用户范围内的一个普通用户管理者,限制指定用户在指定主机上运行某些命令,详细配置请看 sudo 权限管理 例如 sudo 权限管理配置 dolphinscheduler OS 账号只能操作用户 userA,userB,userC 的权限(其中用户 userA,userB,userC 用于多租户向大数据集群提交作业)

echo 'dolphinscheduler  ALL=(userA,userB,userC)  NOPASSWD: NOPASSWD: ALL' >> /etc/sudoers
sed -i 's/Defaults    requirett/#Defaults    requirett/g' /etc/sudoers
要在Kubernetes上部署DolphinScheduler,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装并配置好Kubernetes集群。您可以使用Minikube进行本地测试,或者使用其他云提供商(如AWS、GCP、Azure)提供的Kubernetes服务。 2. 创建DolphinScheduler的命名空间。使用以下命令创建一个新的命名空间: ``` kubectl create namespace dolphinscheduler ``` 3. 创建MySQL数据库。您可以使用Kubernetes的StatefulSet来创建一个运行MySQL的Pod,并使用PersistentVolumeClaim(PVC)来持久化数据。您可以根据自己的需求进行配置。 4. 创建DolphinScheduler配置文件。您可以创建一个ConfigMap来存储DolphinScheduler配置文件。将配置文件保存为一个YAML文件,并使用以下命令创建ConfigMap: ``` kubectl create -n dolphinscheduler configmap dolphinscheduler-config --from-file=dolphinscheduler.properties ``` 5. 部署DolphinScheduler的主控节点(Master)。使用以下命令创建一个Deployment来运行DolphinSchedulerMaster组件: ``` kubectl create -n dolphinscheduler -f https://raw.githubusercontent.com/apache/incubator-dolphinscheduler/v3.1.0/kubernetes/dolphinscheduler-master.yaml ``` 6. 部署DolphinSchedulerWorker节点。使用以下命令创建一个Deployment来运行DolphinSchedulerWorker组件: ``` kubectl create -n dolphinscheduler -f https://raw.githubusercontent.com/apache/incubator-dolphinscheduler/v3.1.0/kubernetes/dolphinscheduler-worker.yaml ``` 7. 部署DolphinScheduler的Logger节点。使用以下命令创建一个Deployment来运行DolphinScheduler的Logger组件: ``` kubectl create -n dolphinscheduler -f https://raw.githubusercontent.com/apache/incubator-dolphinscheduler/v3.1.0/kubernetes/dolphinscheduler-logger.yaml ``` 8. 等待所有组件都正常运行。使用以下命令检查
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值