欢迎转载,转载请注明出版,徽沪一郎。java
本文重点分析storm的worker进程在正常启动以后有哪些类型的线程,针对每种类型的线程,剖析其用途及消息的接收与发送流程。git
worker进程启动过程当中最重要的两个函数是mk-worker和worker-data,代码就不一一列出了。worker顺利启动以后会拥有以下图所示的各种线程。github
worker在启动的时候会生成进程级别的消息接收和消息发送线程,它们视具体配置而定,能够是基于zmq,也能够基于netty,这个没有太多好说的。socket connection的创建过程能够在tuple消息传递一文中找到说明。api
worker须要按期的向zk server发送心跳消息,与zk server之间的链接处理就落到zk client这个线程身上了。具体代码见函数do-heartbeat及do-executor-heartbeats。网络
worker进程须要按期的作些事情,好比发送心跳消息,刷新socket链接,这些定时器归为以下几类,每类定时器运行在各自的线程。socket
上述定时器分类见于worker的shutdown函数,有时候在分析代码的时候,若是从入口看不清楚的话,不妨试试从退出的处理逻辑哪里找找答案。函数
在topology提交的时候曾经见过函数system-topology!,这个函数会建立SystemBolt,每一个worker内有且只有一个SystemBolt,能够见SystemBolt.java中注释的说明或参考github上storm对该改变的说明,https://github.com/nathanmarz/storm/pull/517。ui
SystemBolt主要进行进程相关的统计功能,好比内存使用状况,网络包的吞吐量,具体可见SystemBolt.java。SystemBolt是不接收tuple,只有出度,没有入度。spa
MetricsBolt主要也是处理统计工做,与systembolt不一样的是,metricsbolt主要处理executor级别的,若是用户在配置文件中定义了相关的MetricsConsumer类,那么这些类会在此被执行。
线程
与之相关的配置内容,
## Metrics Consumers
# topology.metrics.consumer.register:
# - class: "backtype.storm.metrics.LoggingMetricsConsumer"
# parallelism.hint: 1
# - class: "org.mycompany.MyMetricsConsumer"
# parallelism.hint: 1
# argument:
# - endpoint: "metrics-collector.mycompany.org"
这个是在storm 0.8中引入的,其用途可在0.8的release notes中找到,建立共享线程池,具体用途没太搞清楚,:).
metrics所作的计量工做是在何时被唤醒的呢,也就是说如何一步步的触发直到MetricsConsumeBolt的execute函数被调用。
下图勾勒出与metrics相关的线程间的消息传递过程。
简要说明以下
注:在worker内部还有另外一套计量api,定义于builtin-metrics.clj中,与MetricsConsumerBolt的区别在于,builtin-metrics是在处理外部进程发送过来的tuple时进行计量统计,而MetricsConsumerBolt是定时触发。