storm中supervisor, task, worker, spout, bolt之间的关系
一个stormtopology运行起来之后,会在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个左右,当然这个参考,实际情况还是要根据配置和测试情况
参考:
http://xumingming.sinaapp.com/category/storm/