Storm并行中的“任务”是啥
Posted
技术标签:
【中文标题】Storm并行中的“任务”是啥【英文标题】:What is the "task" in Storm parallelismStorm并行中的“任务”是什么 【发布时间】:2013-06-19 21:29:53 【问题描述】:我正在尝试通过关注伟大的文章“Understanding the parallelism of a Storm topology”来学习推特风暴
但是我对“任务”的概念有点困惑。任务是组件(spout 或 bolt)的运行实例吗?一个有多个任务的执行者实际上是说同一个组件被执行者多次执行,我正确吗?
此外,在一般的并行性意义上,Storm 将为 spout 或 bolt 生成一个专用线程(执行器),但是具有 多个任务 的执行器(线程)对并行性有何贡献?我认为在一个线程中有多个任务,因为一个线程顺序执行,只会使线程成为一种“缓存”资源,从而避免为下一个任务运行产生新线程。我对么?
在花更多时间调查之后,我可能会自己解决这些困惑,但你知道,我们都喜欢 *** ;-)
提前致谢。
【问题讨论】:
我已经阅读了三次文档以消除同样的困惑,您解决了我的问题。 【参考方案1】:免责声明:我写了the article您在上面的问题中引用。
但是我对“任务”的概念有点困惑。任务是组件(spout 或 bolt)的运行实例吗?一个有多个任务的执行者实际上是说同一个组件被执行者多次执行,我正确吗?
是的,是的。
此外,在一般的并行性意义上,Storm 将为 spout 或 bolt 生成一个专用线程(执行器),但是具有多个任务的执行器(线程)对并行性有何贡献?
每个执行器运行多个任务不会提高并行度——执行器总是有一个线程用于其所有任务,这意味着任务在一个执行器上串行运行。
正如我在文章中所写,请注意:
可以在拓扑启动后更改执行器线程的数量(请参阅storm rebalance
命令)。
拓扑的任务数是静态的。
根据定义,#executors <= #tasks
的不变量。
因此,每个执行程序线程有 2 个以上任务的原因之一是让您可以灵活地在将来通过 storm rebalance
命令扩展/扩展拓扑,而无需使拓扑脱机。例如,假设您开始使用 15 台机器的 Storm 集群,但已经知道下周将添加另外 10 台机器。在这里,您可以选择在 15 个初始框(当然比 25 个框慢)上以 25 台机器的预期并行级别运行拓扑。一旦集成了额外的 10 个盒子,您就可以storm rebalance
拓扑充分利用所有 25 个盒子,而无需停机。
每个执行程序运行 2 个以上任务的另一个原因是(主要是功能性)测试。例如,如果您的开发机器或 CI 服务器的功能仅足以运行 2 个执行器以及机器上运行的所有其他东西,您仍然可以运行 30 个任务(这里:每个执行器 15 个)以查看代码是否如您的自定义 Storm 分组正在按预期工作。
在实践中,我们通常每个执行器运行 1 个任务。
PS:请注意,Storm 实际上会生成 a few more threads behind the scenes。例如,每个执行程序都有自己的“发送线程”,负责处理传出的元组。还有“系统级”后台线程,例如确认与“你的”线程一起运行的元组。 IIRC Storm UI 将除了“你的”线程之外的那些确认线程进行计数。
【讨论】:
@miguno 我有一个问题,假设您最初有一个执行任务的螺栓(例如对数字批处理元组的分组操作)我如何垂直扩展它?据我了解,每个工作人员本质上都是拓扑的“镜像”,但我如何垂直扩展它以将负载分布到所有集群盒中。在这种情况下,我想将执行分组操作的螺栓数量从 1 个更改为 2 个(或更多)。您澄清这一点的意见会很棒。 Storm 的缩放模型使用水平缩放,类似于 Kafka Streams、ksqlDB 或 Spark 等其他处理技术。也就是说,您使用 more 个 worker 进行横向扩展,使用 less 个 worker 进行横向扩展。这就是您在所有集群盒中分配负载的方式。 (相比之下,垂直扩展为相同数量的工作人员提供了更多资源,例如为他们提供更快的 CPU 或更多 RAM。) 例如,要从 1 个螺栓变为 2 个螺栓,您必须停止 Storm 拓扑,重新配置其并行设置(“现在使用 2 个螺栓!”),然后重新启动/重新提交您的拓扑。与 Kafka Streams 不同,Storm 无法在运行时实时弹性地横向扩展或横向扩展——它总是需要关闭拓扑以进行重新配置。以上是关于Storm并行中的“任务”是啥的主要内容,如果未能解决你的问题,请参考以下文章