Kekeの日記

エンジニア、読書なんでも

MacにApache StormをインストールしてApache Kafkaに繋ぐ

f:id:bobchan1915:20180816141145p:plain

Apache StormをhomebrewでインストールしてKafkaに繋ぐまでの記事です。

動機

Mac開発環境の人は多くいる中で、Macでのセットアップ方法が書かれている記事がここ一年だと皆無なので、記事を書こうと思いました。 以下が検索結果である。

f:id:bobchan1915:20180816141653p:plain

Apacheにひっかかてか、Kafkaばかりヒットします。

最近では、いろんなOSSがApache XXX streamみたいな名前でストリーム処理のためのソフトウェアを出しているので、この業界では老舗のようになっています。

f:id:bobchan1915:20180816142353p:plain 引用: https://databaseline.wordpress.com/2016/03/12/an-overview-of-apache-streaming-technologies/

個人的には影響しあってこれらが乱立しているので、老舗を抑えておきたいと思います。

公式サイト

Apache Storm

1. Apache Zookeeperのインストール、起動

brew install zookeeper
brew service start zookeeper

2. Apache StormのHomebrewでのインストール

まずフォーミュラがあることを確認しましょう。

brew search storm
==> Formulae
storm ✔                                               stormlib                                              stormpath-cli                                         stormssh                                              stormssh-completion

あったのでインストールしてみます。

brew install storm

インストール先は/usr/local/Cellar/storm/1.2.2です。 自分はv1.2.2を入れました。

3. Stormの設定

設定ファイルはconf/storm.yamlに記述します。

最低限設定しないといけないことは、

  • zookeeperのサーバー
  • nimbusノード

です。

conf/store.yamlにも

########### These MUST be filled in for a storm configuration
storm.zookeeper.servers:
  - "localhost"

nimbus.seeds: ["localhost"]
# 
# 
# ##### These may optionally be filled in:
...

MUSTと書かれてあります。 localhostの場合は上記のように記述すれば大丈夫です。

  • nimbus.seeds: 古い文献だと、nimbus.seedsではなくてnimbus.hostとなっているかもしれませんが、v1.0+から配列で定義することになったみたいです。
  • storm.local.dir: 状態(state)のためのディレクトリ。デフォルトでは$STORM_HOME/storm-local
  • supervisor.slots.ports: ワーカーの数とポート指定。デフォルトではワーカーは四つ立ちます。

github.com

そしてnimbussupervisorを起動してみましょう。 どれもバックグラウンドで実行するのが良いと思います。

bin/storm nimbus &
bin/storm supervisor &
bin/storm ui &

http://localhost:8080にみに行くとWeb UIがみられます。

f:id:bobchan1915:20180816154930p:plain

どれも数分前にたちあげたものなので良いかと思います。

4. StormとKafkaを接続する

公式サイトには以下のように二つあります。 バージョンごとにかなり差異があるので、注意が必要です。

f:id:bobchan1915:20180816180251p:plain

新しい方を利用することが推奨されているので、そっちを使います。 サンプルが/libexec/examples/store-kafka-client/にあります。

また公式ページでは

final TopologyBuilder tp = new TopologyBuilder();
tp.setSpout("kafka_spout", new KafkaSpout<>(KafkaSpoutConfig.builder("127.0.0.1:" + port, "topic").build()), 1);
tp.setBolt("bolt", new myBolt()).shuffleGrouping("kafka_spout");

のように定義されていました。

ここでは、Tride APIという高レベルAPIが用意されてある。

特にユースケースの大半であるApache Kafka <- Apache Stormの構成で追っていきます。

Kafka関係なく、Apache Stormの主要な概念は解説しません。

4.1 KafkaSpout

KafkaSpoutConfigクラスで実装することできる。 これはbuilderパターンであるので、デザインパターンを知らない人は以下の本が必読です。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

Spoutとして機能させるためにはいくつかの設定をKey/Value形式で渡す必要があります。

exampleでは、以下のよう関数定義しています。

5. Stormのトポロジの追加

Boltは必要性に応じて使用してください。

そして、コンパイルしたら終わりです。

bin/storm jar [jar file] [class name] [topology name] [-option]