天天看點

Storm 核心元件詳解及storm程式設計核心Api

storm程式設計模型

Topologies

Streams

Spouts

Bolts

Storm核心元件

Stream groupings

Reliability

Tasks

Workers

具體介紹如下:

topology 是storm中運作的一個實時應用程式的名稱(拓撲),因為各個元件間的消息流動而形成邏輯上的拓撲結構。

stream 表示資料的流向,流式Storm的核心抽象。一個流是一個無界Tuple序列,Tuple可以包含整性、長整型、短整型、位元組、字元、雙精度數、浮點數、布爾值和位元組數組。使用者可以通過定義序列化器,在本機Tuple使用自定義類型;

spout 在一個topology中擷取源資料流的元件,通常情況下spout會從外部資料源讀取資料,然後轉換為topology内部的源資料;

bolt 接收資料,然後執行處理的元件,使用者可以其中執行自己想要的操作(Bolt可以完成過濾、業務處理、連接配接運算、連接配接通路資料庫等業務);

stream grouping(流分組) 流分組是拓撲定義的一部分,為每個Bolt指定應該接收哪個流作為輸入。在bolt的任務中定義流應該如何分區,Storm有7個内置的流分組接口(随機分組(Shuffle grouping)、字段分組(Fields grouping)、全部分組(All grouping)、全局分組(Global grouping)、無分組(None grouping)、直接分組(Direct grouping)、本地或随機分組(Local or shuffle grouping))

Worker(工作程序)是Spout/Bolt中運作具體處理邏輯的程序。Topology跨一個或多個Worker節點的程序執行,每個Worker節點的程序是一個實體的JVM和Topology執行所有任務的子集。

Task(任務) Worker中每一個Spout/Bolt的線程稱為一個任務。每個spout或bolt在叢集執行許多任務,每個任務對應一個線程的執行,流分組定義如何從一個任務集到另一個任務集發送Tuple。可通過TopologyBuilder類的setSoupt()和setBolt()方法來設定每個spout或bolt的并行度(parallelism)。

總結如下:

Topologies:

拓撲結構對象

   storm是以topologies為機關,來運作作業

Spouts:

資料的産生源頭

Bolts:

處理資料的邏輯

tuples:傳輸資料,此資料是封裝到tuples對象實作

Storm 核心元件詳解及storm程式設計核心Api

分析storm程式設計核心的api

配置pom檔案

Storm 核心元件詳解及storm程式設計核心Api

ISpout接口

ISpout是實作Spout的核心接口, Spout負責将資料送到topology中處理, Storm 會跟蹤Spout發出的tuple的DAG:

當Storm發現tuple的DAG成功的執行處理, 會發送一個ack message給spout,

當執行失敗, 會發送以fail message 給spout;

ISpout接口特點

1.Spout每次釋放tuple, 都會用一個id标記該tuple, 這個id可以是任何類型, 當storm ack 或fail一個message, 就會通過id來追溯到和那個Spout相關聯,如果spout省略了id,或設定一個null, 那麼storm就不追溯到這個tuple資訊, 那就無法回報ack或fail資訊,spout也無法收到資訊。

2.Storm在相同的線程中執行ack , fail , nextTuple,這意味着ISpout的實作者不用考慮這些方法的并發性問題, 但是,同時要保證nextTuple方法不能阻塞,否側導緻ack, fail被阻塞,等待執行,然而fail的timeout決定不能被阻塞。

ISpout方法

Storm 核心元件詳解及storm程式設計核心Api
Storm 核心元件詳解及storm程式設計核心Api

//當Spout元件初始化時,觸發調用此方法

//SpoutOutputCollector:用于發送資料到下遊元件

void open(Map conf, TopologyContext context, SpoutOutputCollector collector);

//産生資料,并且發送資料到下遊元件

void nextTuple();

//資料發送成功,則回調此方法

void ack(Object msgId);

//資料發送失敗,則回調此方法

void fail(Object msgId);

IBolt接口

職責:接收tuple處理,并進行相應的處理(filter/join/....) hold住tuple再處理IBolt會在一個運作的機器上建立,使用Java序列化它,然後送出到主節點(nimbus)上去執行nimbus會啟動worker來反序列化,調用prepare方法,然後才開始處理tuple處理

prepare:初始化

execute:處理一個tuple,tuple對象中包含了中繼資料資訊

cleanup:shutdown之前的資源清理操作

//當bolt元件初始化時,觸發此方法

void prepare(Map stormConf, TopologyContext context, OutputCollector collector);

//此方法接受上遊資料,并且處理資料

void execute(Tuple input);

void cleanup();