1. 程式人生 > >Twitter Storm原始碼分析之Topology的執行過程

Twitter Storm原始碼分析之Topology的執行過程

如何提交一個topology?

要提交一個topology給storm的話, 我們在命令列裡面是這麼做的:

幫助
1 storm jar allmycode.jar org.me.MyTopology arg1 arg2 arg3

那麼在這個命令的背後,storm叢集裡面發生了什麼呢?

storm裡的幕後英雄:nimbus,supervisor

看似簡單的topology提交, 其實背後充滿著血雨腥風(好吧,我誇張了), 我們來看看我們的幕後英雄nimbus, supervisor都做了什麼。

上傳topology的程式碼

首先由Nimbus$IfacebeginFileUploaduploadChunk以及finishFileUpload方法來把jar包上傳到nimbus伺服器上的/inbox目錄

幫助
1 2 3 4 5 6 7 8 9 /{storm-local-dir} | |-/nimbus | |-/inbox                   -- 從nimbus客戶端上傳的jar包 |                            會在這個目錄裡面
| |-/stormjar-{uuid}.jar  -- 上傳的jar包其中{uuid}表示 生成的一個uuid

執行topology之前的一些校驗

topology的程式碼上傳之後Nimbus$IfacesubmitTopology方法會負責對這個topology進行處理, 它首先要對storm本身,以及topology進行一些校驗:

  • 它要檢查storm的狀態是否是active的
  • 它要檢查是否已經有同名的topology已經在storm裡面運行了
  • 因為我們會在程式碼裡面給spout, bolt指定id, storm會檢查是否有兩個spout和bolt使用了相同的id。
  • 任何一個id都不能以”__”開頭, 這種命名方式是系統保留的。
幫助
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 (check-storm-active! nimbus storm-name false) (defn validate-topology! [topology] (let [bolt-ids (keys (.get_bolts topology))

相關推薦

Twitter Storm原始碼分析Topology執行過程

如何提交一個topology? 要提交一個topology給storm的話, 我們在命令列裡面是這麼做的: 幫助 1 storm jar allmycode.jar org.me.MyTopology a

【流式計算】Twitter Storm原始碼分析Nimbus/Supervisor本地目錄結構

  我們知道,storm叢集裡面工作機器分為兩種一種是nimbus, 一種是supervisor, 他們通過zookeeper來進行互動,nimbus通過zookeeper來發布一些指令,supervisor去讀zookeeper來執行這些指令,具體nimbus和supe

【流式計算】Twitter Storm原始碼分析ZooKeeper中的目錄結構

作者: xumingming | 可以轉載, 但必須以超連結形式標明文章原始出處和作者資訊及版權宣告   我們知道Twitter Storm的所有的狀態資訊都是儲存在Zookeeper裡面,nimbus通過在zookeeper上面寫狀態資訊來分配任務,supervisor

libevent原始碼分析執行緒準備工作

libevent中是預設不開啟多執行緒的,也就沒有什麼鎖, 條件變數等的說法了 我們可以使用evthread_use_pthreads()開啟linux下的pthread#ifdef WIN32 int evthread_use_windows_threads(void);

storm原始碼分析acker工作流程

我們知道storm一個很重要的特性是它能夠保證你發出的每條訊息都會被完整處理,完整處理的意思是指: 一個tuple以及這個tuple所導致的所有的tuple都會被成功處理。而一個tuple會被認為處理失敗瞭如果這個訊息在timeout所指定的時間內沒有成功處理。 也就是說對

原始碼分析應用載入過程解析AndroidManifest

一.SystemServer的main方法 /** * The main entry point from zygote. */ public static void main(String[] args) { new SystemServer().run()

Netty原始碼分析Reactor執行緒模型

一、背景  最近在研究netty的原始碼,今天發表一篇關於netty的執行緒框架--Reactor執行緒模型,作為最近研究成果。如果有還不瞭解Reactor模型請自行百度,網上有很多關於Reactor模式。  研究netty的時候,先看了下《netty權威指南》,裡面講解不

UiAutomator系列——Appium Server 原始碼分析啟動執行Express http伺服器(010)

通過上一個系列Appium Android Bootstrap原始碼分析我們瞭解到了appium在安卓目標機器上是如何通過bootstrap這個服務來接收appium從pc端傳送過來的命令,並最終使用uiautomator框架進行處理的。大家還沒有這方面的背景知識的話建議先

6-druid原始碼分析 Hadoop-index 過程

druid 中資料批處理生成segment是通過 hadoop_index 方式來完成的. hadoop_index 主要劃分成兩個過程,由兩個 job 來分別完成. hadoop-index 過程有兩個 MR , 但是它們 Map 操作都是依賴於同一個

Storm原始碼淺析topology的提交

最近一直在讀twitter開源的這個分散式流計算框架——storm的原始碼,還是有必要記錄下一些比較有意思的地方。我按照storm的主要概念進行組織,並且只分析我關注的東西,因此稱之為淺析。        一、介紹    Storm的開發語言主要是Java和Clojure,

android6.0原始碼分析Activity啟動過程

Activity最為android開發者最熟悉的元件,由ActivityManagerService服務進行排程管理,而ActivityManagerService的啟動過程在activitymanagerservice服務原始碼分析一文中進行了詳細分析,本文基

自定義spring boot starter三部曲三:原始碼分析spring.factories載入過程

本文是《自定義spring boot starter三部曲》系列的終篇,前文中我們開發了一個starter並做了驗證,發現關鍵點在於spring.factories的自動載入能力,讓應用只要依賴starter的jar包即可,今天我們來分析Spring和Spring boot原始碼,瞭解s

Uboot啟動過程原始碼分析第二階段

UBoot的最終目標是啟動核心 1.從Flash中讀出核心 2.啟動核心 通過呼叫lib_arm/board.c中的start_armboot函式進入uboot第二階段 第二階段總結圖 typedef struct global_data { bd_t *bd; unsigned

Uboot啟動過程原始碼分析第一階段(硬體相關)

從上一個部落格知道uboot的入口點在 cpu/arm920t/start.s 開啟cpu/arm920t/start.s 跳轉到reset reset: /* * set the cpu to SVC32 mode// CUP設定為管理模式 */ mrs r0,cps

Python 原始碼分析執行時環境

python 執行時環境 執行環境是一個全域性的概念,而執行環境就是指棧幀 當執行時環境已經準備好的時候,執行第一行程式碼的函式就是 PyEval_EvalFrame 函式 PyObject * PyEval_EvalFrame(PyFrameObject *f) {

Yarn原始碼分析MRAppMaster:作業執行方式Local、Uber、Non-Uber

        基於作業大小因素,MRAppMaster提供了三種作業執行方式:本地Local模式、Uber模式、Non-Uber模式。其中,        1、本地Local模式:通常用於除錯;        2、Uber模式:為降低小作業延遲而設計的一種模式,所有任務,不

原始碼分析: WebSocket 和 是如何將收發到的訊息投遞給cocos主執行緒的

-->websocket的3種使用場景: 1)h5瀏覽器中websocket由瀏覽器提供 2)node.js中,可以使用ws模組寫伺服器 3)native app中,可以使用c++版本的websocket匯出c++介面給cocos creator客戶端使用  

Jetty原始碼分析執行緒池:QueuedThreadPool

前面分析Jetty整體架構的時候介紹過Jetty的三大元件:Acceptor、Handler和ThreadPool;前兩者工作的時候都是需要執行緒的,而所需的執行緒正是從ThreadPool中獲取的。這篇檔案就是來分析ThreadPool的一個具體實現:Queu

elasticsearch原始碼分析啟動過程(二)

最近開始廣泛的使用elasticsearch,也開始寫一些java程式碼了,為了提高java程式碼能力,也為了更加深入一點了解elasticsearch的內部運作機制,所以開始看一些elasticsearch的原始碼了。對於這種廣受追捧的開源專案,細細品讀一定會受益匪淺,

workerman原始碼分析啟動過程

PHP一直以來以草根示人,它簡單,易學,被大量應用於web開發,非常可惜的是大部分開發都在簡單的增刪改查,或者加上pdo,redis等客戶端甚至分散式,以及規避語言本身的缺陷。然而這實在太委屈PHP了。記得有一次問walker,PHP能做什麼?他說:什麼都能做啊!當時我就震驚了,這怎麼可能。。。直到後來一