1. 程式人生 > >Storm的基本架構和程式設計流程

Storm的基本架構和程式設計流程

一、Components of a Storm cluster

1)機器級別的結構:one master node,many worker nodes,ZooKeeper nodes

2)程序級別的結構:one daemon called Nimbus run on the master node,one daemon called Supervisor run on each of the worker nodes,ZooKeeper daemon run on each of the ZooKeeper nodes

the Supervisor can start many processes as necessary based on what Nimbus has assigned to it

3)作業稱呼:topology[whereas on Hadoop,it is called MapReduce Job]

 

二、Usage

1)使用者定義一個topology例項,提交給在master node上的Nimbus,然後Nimbus會進行接管,它會通過Supervisor將必需的程式碼複製到所在的worker node,也會進行任務排程等工作

三、Topology介紹

1)Topology是具有圖形狀的計算結構,它包含有兩種節點,分別是SpoutBolt,資料在Topology中以流的形式存在

2)Spout節點是流的源頭,它接受資料,經過處理後以流的形式輸出

3)Bolt

節點是流的處理節點,它接受流資料,經過處理,輸出流資料

4)SpoutBolt節點的輸出節點都只能是Bolt節點

5)Spout的輸入節點是原始資料來源,Bolt的輸入節點可以是Spout節點,也可以是Bolt節點

6)Topology中節點之間傳輸資料的唯一途徑是通過流通道,每條流通道都有一個ID,如果不指定該ID,表示預設流通道,節點之間可以建立多條流通道,而不像圖中所示僅僅只有一條

 

四、關於Topology中的程序(Process),執行緒(Thread),任務(Task)

1)在配置Topology的時候,可以設定整個Topology的程序數量,比如如下:

Config conf=new Config();

conf.setNumWorkers(2);

就是設定整個Topology的程序總數為2個,具體在哪些Worker Nodes上建立程序,由Nimbus排程,具體由Supervisor建立

2)最終任務是通過程序中的執行緒執行的,注意執行緒是在程序中執行的

在設定SpoutBolt的時候,可以指定Spout節點和Bolt節點所需要的執行緒數,比如

TopologyBuilder builder=new TopologyBuilder();

builder.setSpout(“words”,new TestWordSpout(),10);

builder.setBolt(“exclaim”,new ExclamationBolt(),4);

這些執行緒還是在前面提到的程序中執行的

如果通過第1步設定了7個程序,這裡所有節點加起來需要14個執行緒,那麼每個程序中執行2個執行緒

3)任務表示一個節點中真正的處理邏輯,一個執行緒中可以執行1個到多個任務,每個節點的任務數可以人工指定

ComponentConfigurationDeclarer.setNumTasks();

五、流通道和流分組

流通道如上面所述是節點之間傳輸資料的唯一途徑,流分組的概念與流通道的概念互相獨立

在A節點(源節點)和B節點(目的節點)之間建立一條流通道之後,A中的流資料會傳遞到B中,而如上所述,每個節點中有多個任務,如何將得到的流資料分配到各個任務中,就是流分組問題

常見的流分組方式有

1、shuffleGrouping

隨機地將得到的資料分配給多個任務

2、fieldsGrouping

根據欄位值進行劃分[具體是hash方式,模值是任務總數,那麼就能夠保證同值的資料被分配到同一個任務上,但是不能保證同一個任務上只有同值的資料],將得到的資料分配給任務

比如資料值為整數,而現在有兩個任務,那麼一個任務就接受奇數,另外一個任務就接受偶數就好了

六、程式設計流程

針對Topology的程式設計,其實主要是配置實現SpoutBolt節點的邏輯,主要有3個方面:分別是配置節點的流輸入和流輸出,配置節點的流輸入格式和流輸出格式,實現節點的處理邏輯。

1)配置節點的流輸入和流輸出

配置了某個節點的流輸入,其實就同時配置好了另外某個節點的流輸出,因而我們只要配置流輸入就可以。

流的輸入和輸出的關係因具體的流通道的建立而建立,因此配置流的輸入和輸出關係必須指定具體的流通道ID,如果不指定,則採用預設的流通道ID[1]

InputDeclarer介面下的shuffleGrouping()fieldsGrouping()介面都是用來設定流輸入關係的,比如

//”sentences” is the spout instance id

builder.setBolt("split", new SplitSentence(), 8)

        .shuffleGrouping("sentences");

//”split” is the bolt instance id

builder.setBolt("count", new WordCount(), 12)

        .fieldsGrouping("split", new Fields("word"));

2)配置節點的流輸入格式和流輸出格式

配置了某個節點的流輸出格式,其實也就配置了另外某個節點的流輸入格式,因而只需配置節點的流輸出格式就可以。

SpoutBolt實現中的declareOutputFields()介面就用來做這件事

3)實現節點的處理邏輯

Spout實現中的nextTuple()介面和在Bolt實現中的execute()介面就用來做這件事

七、程式設計過程簡化

你定義好一個Topology例項,配置好Spout節點和Bolt節點,並且定義好它們之間的資料連線關係,然後將該例項提交給Nimbus,它會管控好接下來的細節。

從外部來看,整個Storm叢集的表現行為就像一臺主機,只要我們定義好Topology例項提交給它,它就會讀取輸入資料,然後依次經過Spout節點,Bolt節點,最後將結果輸出。

這個邏輯抽象,非常有利於簡化我們的程式設計過程。

這裡的“外部”是指呼叫Nimbus服務的外部應用程式,一般與Nimbus服務處於同一臺機子,即master node,也可以處於非master node上,通過遠端呼叫的形式來呼叫master node上的Nimbus服務

這個外部應用不只可以呼叫Nimbus服務,也可以呼叫本機(master node)的本地服務,比如本機磁碟存取服務

下圖闡述了上述關係



來源:https://storm.apache.org/documentation/Tutorial.html

參考文獻:

[1]https://storm.apache.org/documentation/Concepts.html

[2]http://www.michael-noll.com/blog/2012/10/16/understanding-the-parallelism-of-a-storm-topology/

[3]http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.2/bk_user-guide/content/ch_storm-using-basic-concepts.html

[4]http://book.51cto.com/art/201410/453385.htm

[5]http://ifeve.com/getting-started-with-storm6/