如何理解 Apache Flink 中的槽共享和并行性
How to understand slot sharing and parallelism in Apache Flink
我试图通过示例 WordCount 找出 Flink 中的插槽共享和并行性。
说我要用Flink做字数统计,data source只有一个,sink也只有一个
这样的话,我可以像上图那样做一个设计吗?我的意思是,我在 Source + map()
上设置了两个子任务,在 keyBy()/window()/apply()
上设置了两个子任务,换句话说,我有两行:A --- B --- Sink
和 C --- D --- Sink
这样我可以获得更好的性能。
比如有数据流过来:aaa
、bbb
、aaa
。通过上面的设计,我可能会遇到这样的情况:aaa
和bbb
进入A --- B
,另一个aaa
进入C --- D
。最后,我可以在 Sink
处得到结果 aaa: 2, bbb: 1
。我现在合适吗?
如果我是对的,我知道同一个任务的子任务不能共享一个slot,那么是不是说A
和C
不能共享一个slot,B
和 D
不能共享插槽?我对吗?我如何分配插槽?我应该将 A + B + Sink
放入一个槽位并将 C + D
放入另一个槽位吗?
插槽共享默认启用。启用插槽共享后,所需的插槽数与具有最高并行度的任务的并行度(在本例中为两个)相同。
在此示例中,调度程序会将 A + B + Sink
放入一个槽,将 C + D
放入另一个槽。这不是您通常需要配置甚至考虑太多的东西,因为默认设置在大多数情况下都能很好地工作。
如果您要完全禁用插槽共享,则此作业将需要 5 个插槽,A、B、C、D 和接收器各一个。但是禁用插槽共享几乎不是一个好主意。只需确保每个插槽都有足够的资源来 运行 同时执行所有子任务。
我试图通过示例 WordCount 找出 Flink 中的插槽共享和并行性。
说我要用Flink做字数统计,data source只有一个,sink也只有一个
这样的话,我可以像上图那样做一个设计吗?我的意思是,我在 Source + map()
上设置了两个子任务,在 keyBy()/window()/apply()
上设置了两个子任务,换句话说,我有两行:A --- B --- Sink
和 C --- D --- Sink
这样我可以获得更好的性能。
比如有数据流过来:aaa
、bbb
、aaa
。通过上面的设计,我可能会遇到这样的情况:aaa
和bbb
进入A --- B
,另一个aaa
进入C --- D
。最后,我可以在 Sink
处得到结果 aaa: 2, bbb: 1
。我现在合适吗?
如果我是对的,我知道同一个任务的子任务不能共享一个slot,那么是不是说A
和C
不能共享一个slot,B
和 D
不能共享插槽?我对吗?我如何分配插槽?我应该将 A + B + Sink
放入一个槽位并将 C + D
放入另一个槽位吗?
插槽共享默认启用。启用插槽共享后,所需的插槽数与具有最高并行度的任务的并行度(在本例中为两个)相同。
在此示例中,调度程序会将 A + B + Sink
放入一个槽,将 C + D
放入另一个槽。这不是您通常需要配置甚至考虑太多的东西,因为默认设置在大多数情况下都能很好地工作。
如果您要完全禁用插槽共享,则此作业将需要 5 个插槽,A、B、C、D 和接收器各一个。但是禁用插槽共享几乎不是一个好主意。只需确保每个插槽都有足够的资源来 运行 同时执行所有子任务。