1. 获取每台 Azkaban-exec 的状态
方法:ExecutorManager.refreshExecutors()
调用机制:1. 任务流启动时间点 – 上次 refreshExecutors 的时间 > 参数时间
参数时间:azkaban.activeexecutor.refresh.milisecinterval=6000
代表 6 秒必刷一次。
2. 任务流连续执行的次数 >= 参数次数
参数次数:azkaban.activeexecutor.refresh.flowinterval=3
代表连续执行 3 个任务流必刷一次。
2. PK 角逐出胜者以执行当前任务流。
方法:ExecutorComparator.compare()
角逐规则:
#每台 azkaban-exec 已登记的流的数量;(未运行完成的也算)建议权重 3 #谁少谁胜
azkaban.executorselector.comparator.NumberOfAssignedFlowComparator=3
#每台 azkaban-exec 剩余内存情况;先比绝对值 MB,MB 一样,比百分比。建议权重 2 #谁多谁胜
azkaban.executorselector.comparator.Memory=2
#每台 azkaban-exec 上次调度的时间(非运行持续时间), 建议权重 0 #谁小谁胜
azkaban.executorselector.comparator.LastDispatched=0
#每台 azkaban-exec CPU 负载 建议权重 2 #谁少谁胜
azkaban. executorselector.comparator.CpuUsage=2
3. Azkaban-exec 返回状态
Azkaban-exec 返回状态时,有 1 秒的缓存。
换言之,提交时间1S内,所有的流必然分配到一台机器。
解决这个问题需要修改源码:
部分修改如下:
final List<Pair<String, String>> paramList = new ArrayList<>();
final Pair<String, String> pair;
pair = new Pair<>("nocache", "true");
paramList.add(pair);