官网资源配置策略,当前采取eggroll相关配置:
1.5.0版本开始,为了进一步管理资源,fateflow启用更细粒度的cpu cores管理策略,去除早前版本直接通过限制同时运行作业个数的策略
4.5.1 总资源配置 ¶
- 资源来自于基础引擎,当前版本未实现自动获取基础引擎的资源大小,因此你通过配置文件的方式配置
$PROJECT_BASE/conf/service_conf.yaml指定,fateflow server启动时从配置文件扫描所有基础引擎信息并注册到数据库表t_engine_registry - fate_on_eggroll:
total_cores=cores_per_node*nodes - fate_on_spark:
total_cores=cores_per_node*nodes - fate_on_standalone:
total_cores=cores_per_node*nodes - 不同基础引擎间的资源计算互相隔离
- 以上配置修改后均需要重启fateflow server使之生效
4.5.2 运行资源计算 ¶
计算每个task实际提交到计算引擎的task_run_cores,但并不代表资源调度时的申请量
-
job conf使用task_cores配置:
- task_run_cores(guest, host):
max(task_cores / total_nodes, 1) * total_nodes - task_run_cores(arbiter):
max(1 / total_nodes, 1) * total_nodes - fateflow会将参数自动转换为对应引擎的实际配置参数,如eggroll的eggroll.session.processors.per.node,spark的executor-cores和num-executors
- task_run_cores(guest, host):
-
job conf使用eggroll_run配置:
- task_run_cores(guest, host, arbiter):
eggroll.session.processors.per.node * total_nodes
- task_run_cores(guest, host, arbiter):
-
job conf使用spark_run配置:
- task_run_cores(guest, host, arbiter):
executor-cores * num-executors
- task_run_cores(guest, host, arbiter):
4.5.3 资源调度 ¶
-
作业申请资源的计算
-
对于计算引擎为eggroll、standalone
- apply_cores(guest, host):
task_run_cores * task_parallelism - apply_cores(arbiter):0,因为实际上仅消耗极少量资源且eggroll暂仅支持配置所有node节点cores一致,因此为了避免nodes太多导致arbiter资源扣减资源太多影响作业排队,所以资源调度计算时设为0
- 此处注意,在eggroll集群上,arbiter依然会在每个node被分配了task_run_cores/nodes个cores
- apply_cores(guest, host):
-
对于计算引擎为spark
- 对于spark,支持
executor-cores * num-executors,不与集群nodes数强相关,尤其spark本身有资源调度器,如果此处资源调度计算与实际提交不一致,可能会导致spark作业一直等待 - apply_cores(guest, host, arbiter):
task_run_cores * task_parallelism
- 对于spark,支持
-
-
作业调度策略
- 按提交时间先后入队
- 目前仅支持FIFO策略,也即每次调度器仅会扫描第一个作业,若第一个作业申请资源成功则start且出队,若申请资源失败则等待下一轮调度
-
资源申请规则
- 调度器依据上述调度策略选出作业,分发联邦多方资源申请指令到所有参与方
- 若所有参与方均申请资源成功(total_cores - apply_cores > 0),则该作业申请资源成功
- 若非所有参与方均申请资源成功,则发送资源回滚指令到已申请成功的参与方,该作业申请资源失败
调整示例:
根据上述信息,假设要同时启动4个任务,需要配置以下参数:
-
总资源配置:
- 假设基础引擎为 Eggroll,并且每个节点有 8 个 CPU 核心。
- 则总 CPU 核心数为
total_cores = cores_per_node * nodes = 8 * nodes
-
运行资源计算:
-
使用 job conf 中的
task_cores配置:- 对于 guest 和 host:
task_run_cores = max(task_cores / total_nodes, 1) * total_nodes - 对于 arbiter:
task_run_cores = max(1 / total_nodes, 1) * total_nodes
- 对于 guest 和 host:
-
使用 eggroll_run 配置:
- 对于 guest、host 和 arbiter:
task_run_cores = eggroll.session.processors.per.node * total_nodes
- 对于 guest、host 和 arbiter:
-
使用 spark_run 配置:
- 对于 guest、host 和 arbiter:
task_run_cores = executor-cores * num-executors
- 对于 guest、host 和 arbiter:
-
-
资源调度:
-
对于 Eggroll 和 Standalone:
apply_cores(guest, host) = task_run_cores * task_parallelismapply_cores(arbiter) = 0
-
对于 Spark:
apply_cores(guest, host, arbiter) = task_run_cores * task_parallelism
-
根据具体情况,你需要确定以下参数:
cores_per_node:每个节点的 CPU 核心数nodes:基础引擎的节点数task_cores:每个任务使用的 CPU 核心数task_parallelism:任务并行度
假设我们基于 Eggroll 并且每个节点有 8 个 CPU 核心,假设我们的任务需要使用 2 个 CPU 核心,任务并行度为 2,则计算如下:
total_cores = 8 * nodes- 对于 guest 和 host:
task_run_cores = max(2 / total_nodes, 1) * total_nodes - 对于 arbiter:
task_run_cores = max(1 / total_nodes, 1) * total_nodes apply_cores(guest, host) = task_run_cores * 2apply_cores(arbiter) = 0
需要根据实际情况调整以上参数,并确保配置文件中的配置与这些计算一致,以确保正确地分配和利用资源