歡迎轉載,轉載請註明出版,徽滬一郎。
本文重點分析storm的worker程式在正常啟動之後有哪些型別的執行緒,針對每種型別的執行緒,剖析其用途及訊息的接收與傳送流程。
概述
worker程式啟動過程中最重要的兩個函式是mk-worker和worker-data,程式碼就不一一列出了。worker順利啟動之後會擁有如下圖所示的各類執行緒。
接收和傳送執行緒
worker在啟動的時候會生成程式級別的訊息接收和訊息傳送執行緒,它們視具體配置而定,可以是基於zmq,也可以基於netty,這個沒有太多好說的。socket connection的建立過程可以在tuple訊息傳遞一文中找到說明。
zk client
worker需要定期的向zk server傳送心跳訊息,與zk server之間的連線處理就落到zk client這個執行緒身上了。具體程式碼見函式do-heartbeat及do-executor-heartbeats。
定時器執行緒
worker程式需要定期的做些事情,比如傳送心跳訊息,重新整理socket連線,這些定時器歸為如下幾類,每類定時器執行在各自的執行緒。
- :heartbeat-timer worker
- :refresh-connections-timer worker
- :refresh-active-timer worker
- :executor-heartbeat-timer worker
- :user-timer worker
上述定時器分類見於worker的shutdown函式,有時候在分析程式碼的時候,如果從入口看不清楚的話,不妨試試從退出的處理邏輯哪裡找找答案。
SystemBolt
在topology提交的時候曾經見過函式system-topology!,這個函式會建立SystemBolt,每個worker內有且只有一個SystemBolt,可以見SystemBolt.java中註釋的說明或參考github上storm對該改變的說明,https://github.com/nathanmarz/storm/pull/517。
SystemBolt主要進行程式相關的統計功能,比如記憶體使用情況,網路包的吞吐量,具體可見SystemBolt.java。SystemBolt是不接收tuple,只有出度,沒有入度。
Metrics Bolt執行緒
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"
Shared Executor
這個是在storm 0.8中引入的,其用途可在0.8的release notes中找到,建立共享執行緒池,具體用途沒太搞清楚,:).
Metrics的執行流程
metrics所做的計量工作是在什麼時候被喚醒的呢,也就是說如何一步步的觸發直到MetricsConsumeBolt的execute函式被呼叫。
下圖勾勒出與metrics相關的執行緒間的訊息傳遞過程。
簡要說明如下
- worker在啟動的時候,會往:user-timer中註冊metrics timer(見setup-metrics!函式).
- 一旦metrics timer超時,會傳送一個stream-id為metrics-tick-stream-id的tuple到非metrics型別的bolt,如user/acker/system bolt.
- 接收到tuple之後,會呼叫metrics-tick函式傳送task-data給MetricsConsumerBolt, stream-id為metrics-stream-id
- MetricsConsumerBolt接收到stream-id為metrics-stream-id的tuple後,會執行execute
注:在worker內部還有另一套計量api,定義於builtin-metrics.clj中,與MetricsConsumerBolt的區別在於,builtin-metrics是在處理外部程式傳送過來的tuple時進行計量統計,而MetricsConsumerBolt是定時觸發。