本文目錄一覽:
Storm中進程,線程,任務和實例的關係
以一個具體的例子來闡述“Storm中進程,線程,任務和實例的關係”
假設現在有一個Topology實例,在該Topology實例中,配置為整個Topology實例服務的進程數量為10,配置了Spout單元和Bolt單元以及Spout單元和Bolt單元之間的數據流,為這些Spout和Bolt單元服務的線程和任務數量分別為:Spout單元,10個線程,20個任務;Bolt單元,20個線程,20個任務。
那麼一旦將該Topology實例提交給Nimbus,接下來就會由Nimbus控制運行。
在Nimbus的控制下,有些Supervisor會在所在的worker node上建立一個進程,整個Supervisor集群中共建立10個進程,這些進程都為該Topology實例服務。這些進程可以運行在多個worker node上,也可以運行在同一台worker node上。每個進程都持有對項目JAR包的引用。
現在一共需要30個線程來為Spout和Bolt單元服務,那麼10個進程中,每個進程上運行3個線程。一個進程中的3個線程可以分別為不同的Spout單元和Bolt單元服務。每個線程都創建一份Spout單元或者Bolt單元的實例。
Spout單元共有10個線程,20個任務為其服務,那麼每個線程上運行2個任務,同理為Bolt單元服務的20個線程中的每個線程上運行1個任務。
每個線程中的任務使用線程所持有的Spout實例或者Bolt實例,同一個線程中的多個任務間是串行執行的關係,因而在一個線程有多個任務的情況下,不會產生並發問題。
比如某個線程中持有一個Spout實例spoutInstance,配置該線程中需要運行5個任務,那麼Storm的框架代碼有可能是這麼實現的:
for(int i=0;i5;i++)
{
spoutInstance.nextTuple();
}
storm基本概念
流式計算中,各個中間件產品對計算過程中的角色的抽象都不盡相同,實現方式也是千差萬別。本文針對storm中間件在進行流式計算中的幾個概念做個概括總結。
storm分布式計算結構稱為topology(拓撲)由stream,spout,bolt組成。
spout代表一個storm拓撲中的數據入口,連接到數據源,將數據轉化為一個個tuple,並發射tuple
stream是由無限制個tuple組成的序列。tuple為storm的核心數據結構,是包含了一個或多個鍵值對的列表。
bolt可以理解為計算程序中的運算或者函數,bolt的上游是輸入流,經過bolt實施運算後,可輸出一個或者多個輸出流。
bolt可以訂閱多個由spout或者其他bolt發射的數據流,用以構建複雜的數據流轉換網絡。
上述即為storm最基本的組成元素,無論storm如何運行,都是以stream,spout,bolt做為最基本的運行單元。而這三者則是共同構成了一個storm拓撲topology。
首先需要明確一個概念,bolt,spout實例,都屬於任務,spout產生數據流,並發射,bolt消費數據流,進行計算,並進行落地或再發射,他們的存在以及運行過程都需要消耗資源,而storm集群是一個提供了資源的集群,我們要做的就是將spout/boult實例合理分配到storm集群提供的計算資源上,這樣就可以讓spout/bolt得以執行。
worker為JVM進程,一個topology會分配到一個或者多個worker上運行。
executor是worker內的java線程,是具體執行bolt/spout實例用的。下篇文章在介紹如何提供storm並行計算能力時會介紹worker以及executor的配置。
在storm中,worker是由supervisor進程創建,並進行監控的。storm集群遵循主從模式,主為nimbus,從為supervisor,storm集群由一個主節點(確實有單點問題),和多個工作節點(supervisor)組成,並使用zookeeper來協調集群中的狀態信息,比如任務分配情況,worker狀態,supervisor的拓撲度量。
通過配置可指定supervisor上可運行多少worker。一個worker代表一個slot。
nimbus守護進程的主要職責是管理,協調和監控在集群上運行的topology.包括topology的發布,任務指派,事件處理失敗時重新指派任務。
supervisor守護進程等待nimbus分配任務後生成並監控workers執行任務。supervosior和worker都是運行在不同的JVM進程上。
了解了集群模式下,storm大致的分布概念,下面結合筆者做的一個實例,了解一下如何發布計算資源到storm集群上。
筆者定義了一個spout,兩個bolt 運算過程如下:
其中streamMaking是一個不斷生成隨機數(5~30)的spout實例,Step1Bolt會過濾掉15以下的隨機數(過濾),15以上的隨機數會乘以16(計算),再將結果向後發射。Step2Bolt訂閱Step1Bolt發射的數據,接收數據後,打印輸出。流程結束。
筆者在定義spout/bolt實例時,配置了spout,bolt的並行執行數。其中
streamMaking:4 Step1Bolt:2 Step2Bolt 1
這樣,發布成功後,storm會根據我的配置,分配足夠的計算資源給予spout/bolt進行執行。
發布:
發布時,spout和bolt都是在一起以jar的形式發布到nimbus上的,分配後,內部定義的spout和bolt將以組件的形式被nimbus分配至worker進程中執行。
其中worker都是由supervisor創建的,創建出來的worker進程與supervisor是分開的不同進程。一個supervisor可創建多少worker可通過修改storm安裝目錄下的storm.yaml進行配置。
task是執行的最小單元。spout/bolt實例在定義中指定了,要起多少task,以及多少executor。也即一個topology發布之前已經定義了task總量,和需要多少資源來執行我的task總量。nimbus將根據已有的計算資源進行分配。
下圖中: nimbus左邊代表着計算任務量,和所需計算配置
nimbus右邊代表着計算資源
nimbus將根據計算資源信息,合理的分發計算任務量。
發布成功後,通過storm自帶的UI功能,可以查看你發布的topology運行以及其中每個組件的分布執行情況。
監控圖像中清晰的顯示了,目前部署的topology,以及topology中每個組件所分配的計算資源所在host,以及每個組件發射了多少tuple,接收了多少tuple,以及有多少個executor在並行執行。
本文講述了storm內的基本元素以及基本概念,後續將講述storm的重點配置信息,以及如何提高並發計算能力,窗口概念等高級特性,後續會進行源碼分析,以及與其他實時計算中間件的比較。
請教,icestorm的實例實現,出現了問題
問題現象:安裝MSDE2000時,提示指定的實例名無效 問題原因:安裝MSDE2000時,採用的數據庫默認實例名,如果以前已經安裝過,默認實例名已經被佔用,無論數據庫MSSQLSERVER服務是否啟動,則出現此提示。 解決方案:如果已安裝的數據庫可正常啟動…
如何在Windows下搭建Storm
安裝JAVA:
下載JDK(Storm 需要的環境是JDK6/7),在這個步驟中,我使用JDK 7,大家可以自行到Oracle官網下載。
我將它安裝在:
C:\Java\jdk1.7.0_45\
安裝Python:
為了測試python的安裝,我將部署”word count”來自storm-starter project 的例子,一個用python寫的multi-lang bolt。我使用的python2.7.6可以從這裡下載。
我將python安裝在這裡:
C:\Python27\
安裝以及執行Zookeeper:
下載 Apache Zookeeper 3.3.6並且解壓它。按照如下命令進行配置以及執行:
cd zookeeper-3.3.6
copy conf\zoo_sample.cfg conf\zoo.cfg
.\bin\zkServer.cmd
安裝Storm
允許storm部署到windows下的官方正式版本現在還沒有發布,但是你可以下載並且編譯包含了這個功能的版本,點擊這裡下載。
(源碼分支參考這裡)。
解壓壓縮包到你想要的位置。我選擇 C盤。
配置環境變量
在windows下需要配置兩個環境變量: STORM_HOME 以及 JAVA_HOME ,並且同樣要將安裝路徑配置到PATH中。
JAVA_HOME
C:\Java\jdk1.7.0_45\
STORM_HOME
C:\storm-0.9.1-incubating-SNAPSHOT-12182013\
PATH Add:
%STORM_HOME%\bin;%JAVA_HOME%\bin;C:\Python27;C:\Python27\Lib\site-packages\;C:\Python27\Scripts\;
PATHEXT Add:
.PY
Start Nimbus, Supervisor, and Storm UI Daemons
為每一個運行實例打開一個命令行:
Nimbus
cd %STORM_HOME%
storm nimbus
Supervisor
cd %STORM_HOME%
storm supervisor
Storm UI
cd %STORM_HOME%
storm ui
通過瀏覽器 驗證一下Storm是否已經跑起來了。
部署“Word Count” 拓撲:
編譯 storm-starter 項目。
部署 Word Count 拓撲到你的本地集群中:
storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology WordCount -c nimbus.host=localhost
刷新UI頁面,就可以看到任務已經跑起來了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/293615.html