共计 2642 个字符,预计需要花费 7 分钟才能阅读完成。
这篇文章主要讲解了“Worker、Executor、Task 的关系是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“Worker、Executor、Task 的关系是什么”吧!
1 simple introduction
Storm 在集群上运行一个 Topology 的时刻,主要通过以下 3 个实体来完成 Topology 的执行工作
1 Worker
2 Executor
3 Task
一个 Worker 进程执行的是一个 topology 的子集,这里我们必须强调:不会存在一个 worker 为多个 topology 服务,
一个 worker 进程会启动一个或则多个 executor 线程来执行一个 topology 的 compotent-》也就是 Spout 或者 bolt,
一个 topology 就是由于集群中间的多台物理机上的 Worker 构成的
一个 executor 是一个被 Worker 进程启动的单独线程,每一个 Executor 都只会运行一个 topology 的一个 component,
在默认的情况之下,一个 spout,或则一个 bolt 都只会生成一个 task,Executor 线程里会在每次循环的时候顺序的去调用所有的 task 的实例子
task 是最终运行 spout 或 bolt 中代码的单元(注:1 个 task 即为 spout 或 bolt 的 1 个实例,executor 线程在执行期间会调用该 task 的 nextTuple 或 execute 方法)。topology 启动后,1 个 component(spout 或 bolt)的 task 数目是固定不变的,但该 component 使用的 executor 线程数可以动态调整(例如:1 个 executor 线程可以执行该 component 的 1 个或多个 task 实例)。这意味着,对于 1 个 component 存在这样的条件:#threads =#tasks(即:线程数小于等于 task 数目)。默认情况下 task 的数目等于 executor 线程数目,即 1 个 executor 线程只运行 1 个 task
更加细化的来说:
一个 storm topology 运行起来之后, 会在 supervisor 机器上启动一些进程来运行 spout 和 bolt 实例.
如果一个 topology 里面一共有一个 spout, 一个 bolt。其中 spout 的 parallelism 是 2, bolt 的 parallelism 是 4, 那么我们可以把这个 topology 的总工作量看成是 6,那么一共有 6 个 task,那么 /tasks/{topology-id}下面一共会有 6 个以 task-id 命名的文件,其中两个文件的内容是 spout 的 id, 其它四个文件的内容是 bolt 的 id。
task- node+port, 它其实就是从 task-id 到 supervisor-id+port 的映射,也就是把这个 task 分配给某台机器的某个端口来做。
topology 里面的组件 (spout/bolt) 都根据 parallelism 被分成多个 task, 而这些 task 被分配给 supervisor 的多个 worker 来执行。
task 都会跟一个 componment-id 关联, componment 是 spout 和 bolt 的一个统称.
对于每一个 component 在部署的时候都会指定使用的数量, 在 storm-user 中有一个讨论说明了这个问题:
里面的大意是说, 通过设置 parallelism 来指定执行 spout/bolt 的线程数量. 而在配置中还有另外一个地方 (backtype.storm.Config.setNumWorkers(int)) 来指定一个 storm 集群中执行 topolgy 的进程数量, 所有的线程将在这些指定的 worker 进程中运行. 比如说一个 topology 中要启动 300 个线程来运行 spout/bolt, 而指定的 worker 进程数量是 60 个, 那么 storm 将会给每个 worker 分配 5 个线程来跑 spout/bolt, 如果要对一个 topology 进行调优, 可以调整 worker 数量和 spout/bolt 的 parallelism 数量(调整参数之后要记得重新部署 topology. 后续会为该操作提供一个 swapping 的功能来减小重新部署的时间).
对于 worker 和 task 之间的比例, nathan 也给出了参考, 即 1 个 worker 包含 10~15 个左右, 当然这个参考, 实际情况还是要根据配置和测试情况
3: work 进程内部消息传递处理和数据结构分析
本文从外部消息在 worker 进程内部的转化,传递及处理过程入手,一步步分析在 worker-data 中的数据项存在的原因和意义。试图从代码实现的角度来回答,如果是从头开始实现 worker 的话,该如何来定义消息接口,如何实现各自接口上的消息处理。
3.1 Topology 到 worker 的映射关系
Topology 由 Spout,Bolt 组成,其中的逻辑关系大体如下
请注意 Acker 的行为,是在 tuple,以及 tuple 所产生的其他 tuple 被确认消费掉以后,才会
有你的 ACK 行为
无论是 Spout 或 Bolt 的处理逻辑都需要在进程或线程内执行,那么它们与进程及线程间的映射关系又是如何呢。有关这个问题,Understanding the Parallelism of a Storm Topology 一文作了很好的总结,现重复一下其要点。
1 worker 是进程,executor 对应于线程,spout 或 bolt 是一个个的 task
2 同一个 worker 只会执行同一个 topology 相关的 task
3 在同一个 executor 中可以执行多个同类型的 task, 即在同一个 executor 中,要么全部是 bolt 类的 task,要么全部是 spout 类的 task
4 运行的时候,spout 和 bolt 需要被包装成一个又一个 task
期间的三个组件的关系为:
小结一下,Worker=Process, Executor=Thread, Task=Spout or Bolt.
每一个 executor 使用的是 actor pattern,high level 的处理逻辑如下图所示
感谢各位的阅读,以上就是“Worker、Executor、Task 的关系是什么”的内容了,经过本文的学习后,相信大家对 Worker、Executor、Task 的关系是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!