twitter storm原始碼走讀之4 -- worker程式中執行緒的分類及用途

徽滬一郎發表於2013-12-11

歡迎轉載,轉載請註明出版,徽滬一郎。

本文重點分析storm的worker程式在正常啟動之後有哪些型別的執行緒,針對每種型別的執行緒,剖析其用途及訊息的接收與傳送流程。

概述

worker程式啟動過程中最重要的兩個函式是mk-workerworker-data,程式碼就不一一列出了。worker順利啟動之後會擁有如下圖所示的各類執行緒。

 

接收和傳送執行緒

worker在啟動的時候會生成程式級別的訊息接收和訊息傳送執行緒,它們視具體配置而定,可以是基於zmq,也可以基於netty,這個沒有太多好說的。socket connection的建立過程可以在tuple訊息傳遞一文中找到說明。

zk client

worker需要定期的向zk server傳送心跳訊息,與zk server之間的連線處理就落到zk client這個執行緒身上了。具體程式碼見函式do-heartbeat及do-executor-heartbeats。

定時器執行緒

worker程式需要定期的做些事情,比如傳送心跳訊息,重新整理socket連線,這些定時器歸為如下幾類,每類定時器執行在各自的執行緒。

  1. :heartbeat-timer worker
  2. :refresh-connections-timer worker
  3. :refresh-active-timer worker
  4. :executor-heartbeat-timer worker
  5. :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相關的執行緒間的訊息傳遞過程。

 

簡要說明如下

  1. worker在啟動的時候,會往:user-timer中註冊metrics timer(見setup-metrics!函式).
  2. 一旦metrics timer超時,會傳送一個stream-id為metrics-tick-stream-id的tuple到非metrics型別的bolt,如user/acker/system bolt.
  3. 接收到tuple之後,會呼叫metrics-tick函式傳送task-data給MetricsConsumerBolt, stream-id為metrics-stream-id
  4. MetricsConsumerBolt接收到stream-id為metrics-stream-id的tuple後,會執行execute

注:在worker內部還有另一套計量api,定義於builtin-metrics.clj中,與MetricsConsumerBolt的區別在於,builtin-metrics是在處理外部程式傳送過來的tuple時進行計量統計,而MetricsConsumerBolt是定時觸發。

 

 

相關文章