読者です 読者をやめる 読者になる 読者になる

夢とガラクタの集積場

落ちこぼれ三流エンジニアである管理人の夢想=『夢』と、潰えた夢=『ガラクタ』の集積場です。

1人、Stormソースコードを読んでみよう(No.3

こんにちは。
なんか1年以上忘れ去っていましたが、
最近StormのClojureコードを読むことが増えてきましたので、とりあえずゆるゆると再開してみます。

1.まず重要なのはClojureのコードです

これはStormを扱う上でいうまでもない内容になりますね。
・・・なんですが、私Clojureについて別に詳しいわけでもないんですよね(汗
なので、このソースコードリーディングは一部Clojureの勉強も兼ねて進んでいく形になります。
そのため、そのあたりはご了承ください。

2.Clojureファイル一覧

とりあえずClojureのファイル一覧を挙げてみると下記のようになりました。
全44ファイル。単にファイルだけ見てみると案外少ないような気もします。
名前を見ると実際何を示しているファイルか大体わかりますが、まぁそれは読んだ結果マッピングしていくということで。

storm-0.8.2/src/clj
├─backtype
│  └─storm
│      │  bootstrap.clj
│      │  clojure.clj
│      │  cluster.clj
│      │  config.clj
│      │  disruptor.clj
│      │  event.clj
│      │  LocalCluster.clj
│      │  LocalDRPC.clj
│      │  log.clj
│      │  process_simulator.clj
│      │  stats.clj
│      │  testing.clj
│      │  testing4j.clj
│      │  thrift.clj
│      │  timer.clj
│      │  tuple.clj
│      │  util.clj
│      │  zookeeper.clj
│      │
│      ├─command // Stormに対してコマンドを実行する際のクラス群
│      │      activate.clj // activateコマンドの処理
│      │      config_value.clj
│      │      deactivate.clj
│      │      dev_zookeeper.clj
│      │      kill_topology.clj
│      │      list.clj
│      │      rebalance.clj
│      │      shell_submission.clj
│      │
│      ├─daemon
│      │      acker.clj
│      │      common.clj
│      │      drpc.clj
│      │      executor.clj
│      │      nimbus.clj
│      │      supervisor.clj
│      │      task.clj
│      │      worker.clj
│      │
│      ├─messaging
│      │      loader.clj
│      │      local.clj
│      │      protocol.clj
│      │      zmq.clj
│      │
│      ├─scheduler
│      │      DefaultScheduler.clj
│      │      EvenScheduler.clj
│      │      IsolationScheduler.clj
│      │
│      └─ui
│              core.clj
│              helpers.clj
│
├─storm
│  └─trident
│          testing.clj
│
└─zilch
        mq.clj

3.コマンドを確認します

上記の中で一番わかりやすいのがcommandディレクトリの配下にあるソース群ですね。
見るからに1ソース1コマンドに対応しています。
なので、全部似たような構造だろう・・・ということで、activate.cljを見てみます。

  • activate.clj
(ns backtype.storm.command.activate
  (:use [backtype.storm thrift log])
  (:gen-class))

(defn -main [name] 
  (with-configured-nimbus-connection nimbus
    (.activate nimbus name)
    (log-message "Activated topology: " name)
    ))

・・・これなら何とかなる気がしますね!
とりあえず読んで、コメントを追記した版を。

  • activate.clj(コメント追記版)
(ns backtype.storm.command.activate           // ネームスペース定義
  (:use [backtype.storm thrift log])          // ネームスペース「backtype.storm」の「thrift」「log」を使用する宣言
  (:gen-class))                               // Javaクラス「backtype.storm.command.activate」を生成

(defn -main [name]                            // mainメソッド定義、nameを引数として受け取る
  (with-configured-nimbus-connection nimbus   // thriftのマクロを呼び出し、「nimbus」に設定ファイルを読み込んでNimbusに接続したコネクション(Nimbus$Client)を設定
    (.activate nimbus name)                   // nimbusのactivateメソッドをnameを引数として実行
    (log-message "Activated topology: " name) // logのマクロを呼び出し、ログを出力
    ))

とまぁ、こんな感じで動きを把握することができました。
これくらいだとClojureであっても特に苦労することなく読むことができますね。

4.この辺の情報をまとめ始めています

このあたりの毎回の投稿に埋もれてしまいそうな情報は下記のページにまとめ始めています。
まだ作成中ですが、興味がある方はどうぞ。
なお、トップページにもありますが、全体的な情報は書いていません。
とりあえず呟いた内容と、後はソースコードを読んでわかったことだけ。

http://storm.dsstorage.com/