Intro to Storm

This tutorial will introduce the basic concepts of Apache Storm, the installation and working examples.

Core Concept

  1. What is Storm.
    Storm is a real-time stream processing tool.
  2. Core Concepts
Topology.png
Architecture.png
Components Description
Tuple Tuple is the main data structure in Storm. It is a list of ordered elements. By default, a Tuple supports all data types. Generally, it is modelled as a set of comma separated values and passed to a Storm cluster.
Stream Stream is an unordered sequence of tuples.
Spouts Source of stream. Generally, Storm accepts input data from raw data sources like Twitter Streaming API, Apache Kafka queue, Kestrel queue, etc. Otherwise you can write spouts to read data from datasources. “ISpout" is the core interface for implementing spouts. Some of the specific interfaces are IRichSpout, BaseRichSpout, KafkaSpout, etc.
Bolts Bolts are logical processing units. Spouts pass data to bolts and bolts process and produce a new output stream. Bolts can perform the operations of filtering, aggregation, joining, interacting with data sources and databases. Bolt receives data and emits to one or more bolts. “IBolt” is the core interface for implementing bolts. Some of the common interfaces are IRichBolt, IBasicBolt, etc.
Topology Topology is a directed graph where vertices are computation and edges are stream of data. Storm keeps the topology running until you kill them.
Tasks A task is the execution of a spout or bolt. A spout or bolt has multi tasks.
Workers Every spout or bolt has many workers on worker node whose role is process jobs. But we don't need to care.
Nimbus Master node of Storm which is responsible for assigning data and tasks.
Supervisor Run the tasks assigned by the nimbus
ZooKeeper Monitor the status of nimbus and supervisor and transfer the data and messages between them.

** feature **:

  • Stateless
  • Fault tolerant
  • Efficient, vary fast and extensible

Installation

  1. Install storm on mac os
brew install zookeeper
brew install zeromq
brew install storm

Edit your storm config file storm.yaml in storm/libexec/conf

storm.zookeeper.servers:
- "localhost"
# – “server2”
#
nimbus.host: "localhost"
nimbus.thrift.port: 6627
ui.port: 8772
storm.local.dir: "/Users/yourowndictionary/storm/data"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703

Then, start each service in a console

zkserver start
storm nimbus
storm supervisor
storm ui

Install in develop mode with intellij

  1. Download the source file on storm
  2. unzip it and download the Intellij
  3. Follow the instruction Using storm-starter with IntelliJ IDEA part
    4 . Change the dependency
  <dependency>
      <groupId>org.apache.storm</groupId>
      <artifactId>storm-core</artifactId>
      <version>${project.version}</version>
      <!--
        Use "provided" scope to keep storm out of the jar-with-dependencies
        For IntelliJ dev, intellij will load properly.
      -->
      <!--  <scope>${provided.scope}</scope> -->
    </dependency>

Define Spout Action

A spout class will define the actions about data generation. We will implement an IRichSpout interface. And it has the following methods:

  • open : open an environment include data source
  • nextTuple : Emits the generated data
  • close : shut down the source
public void nextTuple() {
    Utils.sleep(100);
    final String[] words = new String[] {"nathan", "mike", "jackson", "golda", "bertels"};
    final Random rand = new Random();
    final String word = words[rand.nextInt(words.length)];
    _collector.emit(new Values(word));
}

Define Bolt

Bolt subscribe input from spout or other bolt and take actions on them. It will implement IRichBolt interface.

  • prepare ? Provides the bolt with an environment to execute. The executors will run this method to initialize the spout.
  • execute ? Process a single tuple of input.
  • cleanup ? Called when a bolt is going to shutdown.
  • declareOutputFields ? Declares the output schema of the tuple.
public static class ExclamationBolt extends BaseRichBolt {
    OutputCollector _collector;

    @Override
    public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
      _collector = collector;
    }

    @Override
    public void execute(Tuple tuple) {
      _collector.emit(tuple, new Values(tuple.getString(0) + "!!!"));
      _collector.ack(tuple);
    }

    @Override
    public void declareOutputFields(OutputFieldsDeclarer declarer) {
      declarer.declare(new Fields("word"));
    }
  }

Define Topology

TopologyBuilder class provides simple and easy methods to create complex topologies

    TopologyBuilder builder = new TopologyBuilder();

    builder.setSpout("word", new TestWordSpout(), 10);
    builder.setBolt("exclaim1", new ExclamationBolt(), 3).shuffleGrouping("word");
    builder.setBolt("exclaim2", new ExclamationBolt(), 2).shuffleGrouping("exclaim1");

Stream Grouping

When task is send from Bolt A to Bolt B, which task in Bolt B should accept the task?
Stream Grouping will define this.

TopologyBuilder builder = new TopologyBuilder();

builder.setSpout("sentences", new RandomSentenceSpout(), 5);        
builder.setBolt("split", new SplitSentence(), 8)
        .shuffleGrouping("sentences");
builder.setBolt("count", new WordCount(), 12)
        .fieldsGrouping("split", new Fields("word"));

You can refer other methods on doc

Trident on Apache Storm

It is high level stream processing method just like SQL.
Trident API exposes an easy option to create Trident topology using “TridentTopology” class. Basically, Trident topology receives input stream from spout and do ordered sequence of operation (filter, aggregation, grouping, etc.,) on the stream. Storm Tuple is replaced by Trident Tuple and Bolts are replaced by operations.
It includes these important methods:

  • Filter : get the subset of dataset
public class MyFilter extends BaseFilter {
   public boolean isKeep(TridentTuple tuple) {
      return tuple.getInteger(1) % 2 == 0;
   }
}

input

[1, 2]
[1, 3]
[1, 4]

output

[1, 2]
[1, 4]

In storm you can use it like this.

TridentTopology topology = new TridentTopology();
topology.newStream("spout", spout)
.each(new Fields("a", "b"), new MyFilter())
  • Function: Perform a simple operation on a tuple.
public class MyFunction extends BaseFunction {
   public void execute(TridentTuple tuple, TridentCollector collector) {
      int a = tuple.getInteger(0);
      int b = tuple.getInteger(1);
      collector.emit(new Values(a + b));
   }
}
  • Aggregation : perform aggregation operations

  • Grouping

  • Merging and Joining

What's next ? More practice example.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末拿霉,一起剝皮案震驚了整個濱河市隐砸,隨后出現(xiàn)的幾起案子痴奏,更是在濱河造成了極大的恐慌匙隔,老刑警劉巖袭蝗,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油挥,死亡現(xiàn)場離奇詭異翎朱,居然都是意外死亡瘾英,警方通過查閱死者的電腦和手機橙依,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門证舟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窗骑,你說我怎么就攤上這事女责。” “怎么了创译?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵抵知,是天一觀的道長。 經(jīng)常有香客問我,道長刷喜,這世上最難降的妖魔是什么残制? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮掖疮,結果婚禮上初茶,老公的妹妹穿的比我還像新娘。我一直安慰自己浊闪,他們只是感情好恼布,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搁宾,像睡著了一般折汞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盖腿,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天爽待,我揣著相機與錄音,去河邊找鬼翩腐。 笑死鸟款,一個胖子當著我的面吹牛,可吹牛的內容都是我干的栗菜。 我是一名探鬼主播欠雌,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疙筹!你這毒婦竟也來了富俄?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤而咆,失蹤者是張志新(化名)和其女友劉穎霍比,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暴备,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡悠瞬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涯捻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浅妆。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖障癌,靈堂內的尸體忽然破棺而出凌外,到底是詐尸還是另有隱情,我是刑警寧澤涛浙,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布康辑,位于F島的核電站摄欲,受9級特大地震影響,放射性物質發(fā)生泄漏疮薇。R本人自食惡果不足惜胸墙,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望按咒。 院中可真熱鬧迟隅,春花似錦、人聲如沸胖齐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呀伙。三九已至,卻和暖如春添坊,著一層夾襖步出監(jiān)牢的瞬間剿另,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工贬蛙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雨女,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓阳准,卻偏偏與公主長得像氛堕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子野蝇,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容