#概要
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のフィールド名を大文字にして、'_'を'-'にしたものが変数として参照できるようになる。
(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構造。)
(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_HOME
とSTORM_JAR_JVM_OPTS
変数しか利用できないようだ。-
STORM_JAR_JVM_OPTS
には"-Dproperty1=value1 -Dproperty2=value2"
みたいに書くとたぶんうまくやってくれる。
-
-
-
--config
オプションで、storm.conf.file
の設定が可能。この設定は/.storm/storm.yaml
やSTORM_DIR/conf/storm.yaml
より優先される。 -
-c property_name=value
のようにオプションを設定することで、propertyを設定可能。- ここで設定したオプションがstorm.optionsプロパティに設定されることになる。
#デフォルト値
-
defaults.yaml
がstorm-core*.jar
に含まれており、そこからデフォルト値が読まれる。 -
コード的にdefault値が設定されていないとエクセプションを出す部分も多数あり。 デフォルト値があるもの無いものあるので注意が必要。
(defaults.yamlがあるのでまあ大丈夫だけど。)