Storm應用系列之——Topology部署
本系列原始碼地址: https://github.com/EdisonXu/storm-samples
1、Topology有兩種大類提交部署方式:
1)、提交到本地模式
這個非常的簡單。
a. 編寫程式碼
b. 直接就可以在IDE裡面執行,也可以提交到nimbus上,用nimbus進行本地執行:
2)、提交到叢集
a. 編寫程式碼
b. 編譯jar包
因為我是Maven專案,所以直接 mvn clean install 生成jar
c. 上傳至nimbus部署
./storm jar storm-samples.jar com.edi.storm.topos.ClusterRunningTopology
2、實際開發時常用提交模式
實際開發時,我們往往是把本地和叢集混綁在一起,用傳入引數以示區別
這樣,本地就可以不傳參直接執行,而需要部署到叢集時,打完包傳到nimbus上執行命令:
./storm jar storm-samples.jar com.edi.storm.topos.ClusterRunningTopology <TOPO_NAME>
填上一個叢集唯一的<TOPO_NAME>即可。
有人又說了,這樣還不是很方便,我能不能直接在IDE裡面提交到storm叢集?
可以。
3、IDE直接提交至叢集
修改上面提交叢集的程式碼如下:
起作用的部分主要有三點:
1). 設定系統變數"storm.jar"。這個變數的值代表要部署的Topology的jar包地址。
這個地址必須是檔案,所以,我們就可以寫完程式碼後自己打個jar包放在某個固定位置,然後IDE直接執行該topology去叢集提交部署。
當然,也可以在程式碼中打jar,所以我這裡的程式碼中加入了一個打包的Utilities類,EJob。
2). 設定引數Config.NIMBUS_HOST,其值為nimbus的hostname或ip地址。
3). 設定引數Config.NIMBUS_THRIFT_PORT,其值為nimbus上Thrift介面的地址
也就是nimbus的conf/storm.yaml中引數nimbus.thrift.port的值,前提是你配了。如果沒配,可以不設。
這樣就可以直接在IDE裡面執行提交上去了。
4、Topology提交原理
Topology提交後發生了什麼呢?這個原理要放在這裡講了。因為這直接關係到對Strom執行概念的理解。
1). Nimbus$Iface的beginFileUpload,uploadChunk以及finishFileUpload方法將執行的包上傳至其資料目錄(storm.yaml中storm.local.dir對應的目錄)下的inbox目錄。
不論上傳的包名字是什麼,最終會變成stormjar-{uuid}.jar。
2). Nimbus$Iface的submitTopology方法會負責對這個topology進行處理,首先是對Storm本身及topology進行一些校驗:
a. 檢查Storm狀態是否active
b. 檢查是否有同名topology在執行
c. 檢查是否有同id的spout和bolt,以及其id是否合法。任何一個id都不能以"_"開頭,這種命名方式是系統保留的。
3). 建立topology的本地目錄
4). 建立該topology在zookeeper上的心跳目錄
nimbus老兄是個有責任心的人,它雖然最終會把任務分成一個個task讓supervisor去做,但是它時刻在關注著大家的情況,所以它要求每個task每隔一定時間就要給它打個招呼(心跳資訊),讓它知道事情還在正常發展。如果有task超時不打招呼,nimbus會人為這個task不行了,然後進行重新分配。zookeeper上的心跳目錄:
5). 計算topology的工作量
nimbus會根據topology中給的parallelism hint引數,來給spout/bolt設定task數目,並分配相應的task-id,然後把分配號的task資訊寫到zookeeper上去:
6). 儲存toplogy資訊到zookeeper 7). supervisor因為監聽了zookeeper上的目錄,所以當它發現有topology時,會先把所有的topology的資訊如jar等下到本地,並刪除不再執行的topology的本地資訊
8). supervisor根據分配的任務,去啟動worker去處理assignment9). worker啟動後,會去zookeeper上找其對應的task。同時根據task的outbound資訊建立對外的socket連線,將來傳送tuple就是從這些socket連線發出去的。
到這裡,一個topology就已經完全部署和運轉起來了
原文地址:http://blog.csdn.net/xeseo/article/details/18219183
1、Topology有兩種大類提交部署方式:
- 提交到本地模式,一般用於除錯。該模式下由於是起在同一個JVM程式下,所以不要讓其負載太高。
-
提交到叢集模式。
1)、提交到本地模式
這個非常的簡單。
a. 編寫程式碼
b. 直接就可以在IDE裡面執行,也可以提交到nimbus上,用nimbus進行本地執行:
2)、提交到叢集
a. 編寫程式碼
b. 編譯jar包
因為我是Maven專案,所以直接 mvn clean install 生成jar
c. 上傳至nimbus部署
./storm jar storm-samples.jar com.edi.storm.topos.ClusterRunningTopology
2、實際開發時常用提交模式
實際開發時,我們往往是把本地和叢集混綁在一起,用傳入引數以示區別
這樣,本地就可以不傳參直接執行,而需要部署到叢集時,打完包傳到nimbus上執行命令:
./storm jar storm-samples.jar com.edi.storm.topos.ClusterRunningTopology <TOPO_NAME>
填上一個叢集唯一的<TOPO_NAME>即可。
有人又說了,這樣還不是很方便,我能不能直接在IDE裡面提交到storm叢集?
可以。
3、IDE直接提交至叢集
修改上面提交叢集的程式碼如下:
起作用的部分主要有三點:
1). 設定系統變數"storm.jar"。這個變數的值代表要部署的Topology的jar包地址。
這個地址必須是檔案,所以,我們就可以寫完程式碼後自己打個jar包放在某個固定位置,然後IDE直接執行該topology去叢集提交部署。
當然,也可以在程式碼中打jar,所以我這裡的程式碼中加入了一個打包的Utilities類,EJob。
2). 設定引數Config.NIMBUS_HOST,其值為nimbus的hostname或ip地址。
3). 設定引數Config.NIMBUS_THRIFT_PORT,其值為nimbus上Thrift介面的地址
也就是nimbus的conf/storm.yaml中引數nimbus.thrift.port的值,前提是你配了。如果沒配,可以不設。
這樣就可以直接在IDE裡面執行提交上去了。
4、Topology提交原理
Topology提交後發生了什麼呢?這個原理要放在這裡講了。因為這直接關係到對Strom執行概念的理解。
1). Nimbus$Iface的beginFileUpload,uploadChunk以及finishFileUpload方法將執行的包上傳至其資料目錄(storm.yaml中storm.local.dir對應的目錄)下的inbox目錄。
不論上傳的包名字是什麼,最終會變成stormjar-{uuid}.jar。
2). Nimbus$Iface的submitTopology方法會負責對這個topology進行處理,首先是對Storm本身及topology進行一些校驗:
a. 檢查Storm狀態是否active
b. 檢查是否有同名topology在執行
c. 檢查是否有同id的spout和bolt,以及其id是否合法。任何一個id都不能以"_"開頭,這種命名方式是系統保留的。
3). 建立topology的本地目錄
4). 建立該topology在zookeeper上的心跳目錄
nimbus老兄是個有責任心的人,它雖然最終會把任務分成一個個task讓supervisor去做,但是它時刻在關注著大家的情況,所以它要求每個task每隔一定時間就要給它打個招呼(心跳資訊),讓它知道事情還在正常發展。如果有task超時不打招呼,nimbus會人為這個task不行了,然後進行重新分配。zookeeper上的心跳目錄:
5). 計算topology的工作量
nimbus會根據topology中給的parallelism hint引數,來給spout/bolt設定task數目,並分配相應的task-id,然後把分配號的task資訊寫到zookeeper上去:
6). 儲存toplogy資訊到zookeeper 7). supervisor因為監聽了zookeeper上的目錄,所以當它發現有topology時,會先把所有的topology的資訊如jar等下到本地,並刪除不再執行的topology的本地資訊
8). supervisor根據分配的任務,去啟動worker去處理assignment9). worker啟動後,會去zookeeper上找其對應的task。同時根據task的outbound資訊建立對外的socket連線,將來傳送tuple就是從這些socket連線發出去的。
到這裡,一個topology就已經完全部署和運轉起來了
原文地址:http://blog.csdn.net/xeseo/article/details/18219183
相關文章
- Storm 系列(九)—— Storm 整合 KafkaORMKafka
- Storm系列(六)storm和kafka整合ORMKafka
- Dubbo 入門系列之快速部署一個微服務應用微服務
- Storm 系列(三)—— Storm 單機版本環境搭建ORM
- Storm系列(三)java編寫第個storm程式ORMJava
- 容器化部署實踐之Django應用部署(二)Django
- SpringCloud系列之Nacos應用篇SpringGCCloud
- Docker 入門系列三:Docker 應用部署-MySQLDockerMySql
- Docker 入門系列三:Docker 應用部署-NginxDockerNginx
- Docker 入門系列三:Docker 應用部署-RedisDockerRedis
- Java應用伺服器之tomcat部署Java伺服器Tomcat
- Spring Boot Serverless 實戰系列“部署篇” | Mall 應用Spring BootServer
- 『輕鬆部署 Laravel 應用』系列文章快捷連結Laravel
- Redis系列之(二)——應用場景Redis
- 使用Docker容器化部署實踐之Django應用部署(一)DockerDjango
- Storm系列(二)常用shell命令操作ORM
- Apache Storm系列 之二( 輕鬆搞定 Storm 安裝與啟動)ApacheORM
- SpringCloud系列之Nacos+Dubbo應用篇SpringGCCloud
- Spring Security系列之入門應用(二)Spring
- 入門系列之Kubernetes部署
- 【譯】Apache Storm系列 之一(核心概念)ApacheORM
- Storm系列(一)環境搭建安裝ORM
- DevOps最佳實踐之應用開發和部署dev
- RMI應用部署
- SpringCloud系列之Nacos+Dubbo+Seata應用篇SpringGCCloud
- SpringCloud系列之閘道器(Gateway)應用篇SpringGCCloudGateway
- 輕鬆部署 Laravel 應用 | 《08. 手動部署 - 部署應用程式碼》Laravel
- Storm系列(五)DRPC實現遠端呼叫ORMRPC
- CI/CD系列之阿里云云效2020應用篇阿里
- Netty系列文章之構建HTTP(HTTPS)應用程式NettyHTTP
- SQLCoder部署和應用SQL
- LNMP部署及應用LNMP
- Kubernetes(二) 應用部署
- Docker部署Angular應用DockerAngular
- Flask 應用如何部署Flask
- Storm系列(四)並行度和流分組ORM並行
- DCOS雲平臺之業務多應用部署改造方案
- SpringCloud系列之整合分散式事務Seata應用篇SpringGCCloud分散式
- ViewPager系列之 仿魅族應用的廣告BannerViewViewpager