Apache Storm に関するメモ (概念編+α)

# [公式ページ](http://storm.apache.org/)
公式ページによるとApache Stormは'distributed realtime computation system'，分散リアルタイム計算システム。記事の執筆時点(2017年2月)でv1.0.3が最新バージョン。以下，基本的に公式ページの内容に沿って書いていく。

## [Rationale](http://storm.apache.org/releases/current/Rationale.html)
MapReduceやHadoopなどの違いはリアルタイム処理が可能なこと。(以前はバッチ処理のみ)
特徴は次の通り。

- 幅広いユースケース
- スケーラブル。スケールさせるためにはマシンを増やすだけ。
- データロスがない。
- 堅牢性
- Fault-tolerant (耐障害性)
- Programming language agnostic (プログラム言語非依存)

# [コンセプト](http://storm.apache.org/releases/1.0.3/Concepts.html)
1. トポロジー
2. ストリーム
3. スパウト (spout)
4. ボルト (bolt)
5. ストリームグループ
6. 信頼性 (Reliability)
7. タスク
8. ワーカー (Workers)

## トポロジー
トポロジーはスパウトとボルトのつながりのこと。

![topology.png](https://qiita-image-store.s3.amazonaws.com/0/26865/b088d8ec-0b6d-d8eb-0f27-b6414982a652.png)

## ストリーム
Streams are defined with a schema that names the fields in the stream's tuples.　
デフォルトで次の型がある。
>integers, longs, shorts, bytes, strings, doubles, floats, booleans, and byte arrays. 

## スパウト
スパウトはトポロジーにおいてストリームの源。(Spoutは水などの噴出しのこと)
スパウトには　**reliable か unreliable**がある. reliable spoutは処理に失敗したら再送機能がある。 whereas an unreliable spout forgets about the tuple as soon as it is emitted.

![storm-flow.png](https://qiita-image-store.s3.amazonaws.com/0/26865/7517e6c0-f814-440a-04a2-6d47989e2e45.png)

## ボルト
すべての計算はボルトの中で行われる
例えば，filtering, functions, aggregations, joins, talking to databases, 

複雑なトポロジーではボルトは複数段になってもかまわない。
ボルトは複数のストリームに出力してもかまわない。**declareStream** method を使って複数のストリームを定義することができる。

## ストリームグループ
ストリームグループはストリームがタスクの間でどのように分割されるのか？を定義する)
」
![topology-tasks.png](https://qiita-image-store.s3.amazonaws.com/0/26865/6d0538be-73aa-7ea3-3408-31dff7ee6de0.png)

8種類のストリームグループが存在する。
1. Shuffle grouping : タプルがランダムにタスクに分配される。
2. Fields grouping
3. Partial Key grouping
4. All grouping : ストリームがすべてのタスクに複製される。注意して使うこと。
5. Global grouping
6. None grouping : 現時点ではShuffle groupingと同じ。
7. Direct grouping
8. Local or shuffle grouping

## 信頼性
Storm guarantees that every spout tuple will be **fully processed** by the topology. (すべてのスパウトはトポロジーにより完全に処理される)
Every topology has a "message timeout" associated with it. If Storm fails to detect that a spout tuple has been completed within that timeout, then it fails the tuple and replays it later.(すべてのトポロジーはタイムアウト時間がある。Stormがタイムアウトを検出すると，後に再送する)

## タスク
Each spout or bolt executes as many tasks across the cluster.

## ワーカー
Each worker process is a physical JVM and executes a subset of all the tasks for the topology.

#API
[REST API](http://storm.apache.org/releases/1.0.3/STORM-UI-REST-API.html)
> http://\<ui-host\>:\<ui-port\>/api/v1/...

#[Trident](http://storm.apache.org/releases/1.0.3/Trident-tutorial.html)
Trident is a high-level abstraction for doing realtime computing on top of Storm.
Storm のコントローラー？ラッパーみたいなもの？Javaプログラム。

# セットアップ
1. Set up a Zookeeper cluster
2. Install dependencies on Nimbus and worker machines
3. Download and extract a Storm release to Nimbus and worker machines
4. Fill in mandatory configurations into storm.yaml
5. Launch daemons under supervision using "storm" script and a supervisor of your choice

## ZooKeeper
StormではZooKeeperはクラスタの調整のみに使用される。メッセージ処理には利用されない。

## Nimbusとworkerマシンの前提をインストール
Java7 and Python 2.6.6
(これ以外のバージョンでは動くかもしれないし，動かないかもしれない。。。)

## Stormのダウンロード・解凍
ここからダウンロード
https://github.com/apache/storm/releases

## storm.yamlファイルの編集
設定ファイルは**conf/storm.yaml**
設定項目は，
1 storm.zookeeper.servers (zookeeperサーバーのIP)，storm.zookeeper.port(同じくポート番号)

```conf/storm.yaml
storm.zookeeper.servers:
  - "111.222.333.444"
  - "555.666.777.888"
```

2 storm.local.dir　(デーモンが使う場所)

```conf/storm.yaml
storm.local.dir: "/mnt/storm"
```

3 nimbus.seeds : The worker nodes need to know which machines are the candidate of master in order to download topology jars and confs. 

```conf/storm.yaml
nimbus.seeds: ["111.222.333.44"]
```

4 supervisor.slots.ports (workerが使うポート)

```conf/storm.yaml
supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703
```

# 起動
最後のステップはデーモンの起動。Stormは状態を持たないので，いつでも安全に停止できる。
デーモンの起動方法

1. Nimbus : "bin/storm nimbus" under supervision on the master machine.
2. Supervisor : "bin/storm supervisor" under supervision on each worker machine
3. UI : "bin/storm ui" under supervision. http://{ui host}:8080.

![storm-cluster.png](https://qiita-image-store.s3.amazonaws.com/0/26865/e6ba0cc1-1563-57a6-14ba-6495e1d1c2c5.png)

# 次読むもの
[Tutorial](http://storm.apache.org/releases/current/Tutorial.html)