目的
目前(Flink 1.9), Flink采用粗粒度的资源管理方法,task根据job的最大并行度,部署到尽可能多的预定义slot中,而不管每个task/operator可以使用多少资源。
上述方法易于设置,但是不能最佳的利用资源和性能。
- 任务可能具有不同的并行度(parallelisms),因此不是所有的slot都包含完整的任务管道(task pipeline)。对于任务较少的slot,为整个pipeline预定义的slot资源可能会造成浪费。
- 在资源使用方面(堆、网络、托管内存等),很难将slot提供的资源与task需求保持一致。
我们计划实现细粒度资源管理,在tasks资源需求已知、tasks资源需求未知(即可调整),这两种情况下,优化资源的使用。
我们计划改进Flink的资源管理机制,使得:
- 流处理和批处理模式下,均能很好的工作
- 已指定或未知task需要的资源,均能很好的工作
当前FLIP主要关注细粒度资源管理的一个方面:Operator资源管理
- 我们计划基于比例来管理内存配额,以统一以下内存管理场景:Operator指定了资源需求、Operator未指定资源需求
- 我们计划将slot共享组缩小到pipelined regions单元,在不同的pipelined regions中,task可以并发运行,使用这种方法,对于tasks/Operator在同一个slot中共享内存,我们可以得到合理但又不太保守的比例。
范围
- 当前FLIP提出的方法,应该只适用于Blink planner提供的DataStream API和SQL/Table API作业(blink planner内部包括无界流处理和有界批处理job)。当前FLIP不能作用于DataSet API(批处理job)
- 对于Dataset Job,已经有一些基于比例的方法实现(在TaskConfig和ChainedDriver中),我们不会对这些已有的方法做任何更改
- 本FLIP假定Job的Operators具有已知的资源请求配置,这些资源需求配置,已经在 PhysicalTransformations类中ResourceSpecs里描述。
- 本FLIP不会讨论怎样设置一个Job中,Operators的资源需求配置
- 当前状态(包括Flink 1.10开发计划),如何设置Job Opererators的资源需求的可以描述如下:
- SQL/Table API–Blink optimizer(优化器)可以根据用户的configuration(配置),设置Operator资源(默认:未知)
- DataStream API–目前没有设置Operator资源的方法/接口。可以在以后添加
- DataSet API–已经有用户接口,用于设置Operator资源
公共接口
- ResourceSpec对象
- 引入一个新的配置“taskmanager.defaultSlotResourceFraction”,虽然不赞成这种方式,但是与"taskmanager.numberOfTaskSlots"配置保持兼容
修改建议
通用的Workflow(工作流)
细粒度Operator资源管理前提下,一个通用的workflow实现方式如下:
- 未知的(默认)或指定的(例如blink planner)PhysicalTransformations#ResourceSpecs对象,它们描述了t