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