【发布时间】:2020-12-15 23:43:25
【问题描述】:
假设我的 Flink 应用程序有 3 个组件:Source、Map 和 Sink。由于某些原因(例如调用 API 具有非常高的延迟),接收器需要具有非常高的并行度(例如 20)。还假设 Source 和 Map 占用很少的 CPU/IO。我们知道最小可用槽应该至少与应用程序的最大并行度一样大,在本例中为 20。部署此应用程序将有两种方式:
- 如果我已经有 Flink 集群,部署这个应用会占用 20 个 slot。但是,我的 Source 和 Map 不需要太多资源,所以这 20 个 slot 大部分时间都是空闲的(等待,因为 sink 调用 API 的延迟很高)。在这种情况下,我是在浪费资源。
- 我可以为此应用程序设置一个按作业集群,并将每个任务管理器的槽数设置得非常高,以减少每个槽的资源。在这种情况下,我还需要将 Map 的并行度设置为较高的值,以获得足够的 CPU 容量。但是,由于 Map 受 CPU 限制,高并行性会导致性能下降(线程上下文切换)。
所以我的问题是,在这种情况下,最佳做法是什么?
之前我使用的是 Apache Storm。对于 Storm 应用程序,我需要指定工作人员编号(插槽)和每个操作员的并行度。但是,可用slots不需要至少大到应用程序的最大并行度,所以对于这个应用程序,我可以设置2个worker,Source和Map设置2个并行度,Sink设置20个并行度,这样就可以了最终只占用 2 个插槽,每个插槽有 1 个源、1 个地图和 10 个 Sink bolts。我觉得这样既满足了高并行sink的需求,又能很好的利用资源(只有2个Map)。为什么人们要这样设计 Flink 并行性?还是我的理解有误?
【问题讨论】:
-
在我的回答中,我假设这是一个流应用程序。如果是批处理,那么对话会有所不同。
-
是的,它是一个流媒体应用
-
David 在下面使用选项#2 提出的建议在类似情况下对我们来说效果很好。您仍然需要以
DiscardingSink结尾,因此 Flink 对您拥有完整的工作流程感到满意,但所有有趣的调优/并行性都通过该接收器之前的 AsyncIO 函数发生。
标签: apache-flink