我认为https://stackoverflow.com/a/47714449/8845188是一个很好的答案,但我会尝试将其改写为示例:
提交拓扑时,组件(例如 spout 或 bolt)的任务数量是一成不变的,而执行器的数量可以在不重新部署拓扑的情况下更改。执行者的数量总是小于或等于一个组件的任务数量。
问题 1
您通常没有理由选择在 1 个执行器中运行例如 2 个任务,但如果您当前的负载较低但预计稍后会出现高负载,您可以选择提交任务数量多但数量少的拓扑的执行者。当然,您可以根据需要提交具有尽可能多的执行程序的拓扑,但是由于上下文切换和/或潜在的资源争用,当您只需要几个线程时使用多个线程效率低下。
例如,假设您提交了拓扑,因此 spout 有 4 个任务和 4 个执行器(每个执行器一个)。当您的负载增加时,您无法进一步扩展,因为 4 是您可以拥有的最大执行器数量。您现在必须重新部署拓扑以随负载扩展。
假设您提交了拓扑,因此 spout 有 32 个任务和 4 个执行器(每个 8 个)。当负载增加时,您可以将执行程序的数量增加到 32 个,即使您一开始只有 4 个。您可以在不重新部署拓扑的情况下进行扩展。
问题2
假设您的拓扑有一个 spout A 和一个 bolt B。假设 bolt B 做了一些重量级的工作(例如,每个执行器每秒可以做 10 个元组),而 spout 是轻量级的(例如,每个执行器每秒可以做 1000 个元组) . 假设您的负载最初是每秒 20 条消息进入拓扑,但您希望它会增长。
在这种情况下,您可以使用 1 个执行程序和 1 个任务来配置您的 spout,因为它可能大部分时间都处于空闲状态。同时,您希望为 Bolt 配置大量任务,以便为它扩展执行器的数量,并至少启动 2-3 个执行器。