LoginSignup
3
3

More than 5 years have passed since last update.

Storm Configについて

Last updated at Posted at 2014-07-31

概要

StormにおけるConfigの扱いについてのメモ。
(調査対象はstorm-0.9.2-incubating)

基本ルール

  • プロパティの読み込みは以下の順序。下ほど優先度が高い。

    • storm-core*.jarにあるdefaults.yaml
    • CLASSPAHT以下にあるstorm.yamlもしくはstorm.conf.fileプロパティで指定されたファイル(storm.conf.fileプロパティをdefaults.yamlから読ませることはできない点に注意。storm起動時に-Dで渡す必要がある。storm.yamlと「storm.conf.fileプロパティで指定したファイル」両方を読ませることはできないので注意。)
    • -Dstorm.optionsで渡されたプロパティ。(-Dstorm.options=propertyname1=value1,propertyname2=value2,... みたいに複数渡せる。)

ソースコードで確認する際のTIPS

  • storm-core/src/jvm/backtype/storm/Config.javaにStormが利用するプロパティ名がすべて書かれている。

    • Stormが使うプロパティにはスキーマ定義が付随しており、値がこのスキーマに適応していない場合エラーになる。
    • スキーマと符号するかのチェックはread-storm-config関数の流れで読み込みとほぼ同時に行われる。
  • Stormのソースコード中ではConfigのフィールド名を大文字にして、'_'を'-'にしたものが変数として参照できるようになる。

storm-core/src/clj/backtype/storm/config.clj
   (defn- clojure-config-name [name]
   (.replace (.toUpperCase name) "_" "-"))

   ;; define clojure constants for every configuration parameter
   (doseq [f (seq (.getFields Config))]
     (let [name (.getName f)
           new-name (clojure-config-name name)]
       (eval
         `(def ~(symbol new-name) (. Config ~(symbol name))))))
  • 例えば、public static final String STORM_SCHEDULER = "storm.scheduler";はclojureの中からはSTORM-SCHEDULERという名前の変数(binding)になる。

  • この大文字varにプロパティ名が入るので以下みたいに使う。(confはclojureのmap構造。)

storm-core/src/clj/backtype/storm/config.clj
        (defn cluster-mode
          [conf & args]
          (keyword (conf STORM-CLUSTER-MODE))) <- ここ
  • yamlファイルには、Config.javaに記載されているもの以外の任意のプロパティも追加することができる。(Configを持つHashMapに自分のプロパティが追加される。)
    • このMap構造はトポロジからもアクセスできるため、この機能を利用して自身の環境向けの独自 プロパティを渡せる。
    • だが、SCHEMA定義の追加はConfig.javaを改造しないかぎり追加はできない。
    • また、FieldsとしてConfig.java登録されていないプロパティ名は上記のclojureコードは大文字var化をしてくれない。

ラッパースクリプト(stormコマンド)

普通stormコマンド経由だからこっちのほうがある意味重要。というかpdbで処理を追ったらいいと思うよ。

その他のJavaプロダクトと同様に、Stormではjavaコマンドを直接打ち込まずに各種機能の実行ができるようになっている。

具体的には、bin/stormというpythonスクリプトがjavaのラッパースクリプトである。
このスクリプトの挙動を設定面に関してメモしておく。

  • もし ~/.storm/storm.yamlが存在した場合、システム共通のSTORM_DIR/conf/storm.yamlの代わりに、~/.storm/storm.yamlのみをCLASSPATHに設定する。
  • STORM_DIR/conf/storm_env.iniを読み込み、OSの環境変数に設定する。(iniファイルの読み取り先は変更できない。)

    • といっても見た感じ、JAVA_HOMESTORM_JAR_JVM_OPTS変数しか利用できないようだ。
    • STORM_JAR_JVM_OPTSには"-Dproperty1=value1 -Dproperty2=value2"みたいに書くとたぶんうまくやってくれる。
  • --configオプションで、storm.conf.fileの設定が可能。この設定は/.storm/storm.yamlSTORM_DIR/conf/storm.yamlより優先される。

  • -c property_name=valueのようにオプションを設定することで、propertyを設定可能。

    • ここで設定したオプションがstorm.optionsプロパティに設定されることになる。

デフォルト値

  • defaults.yamlstorm-core*.jarに含まれており、そこからデフォルト値が読まれる。

  • コード的にdefault値が設定されていないとエクセプションを出す部分も多数あり。 デフォルト値があるもの無いものあるので注意が必要。
    (defaults.yamlがあるのでまあ大丈夫だけど。)

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3