Asakusa Frameworkにおいて、Asakusaアプリケーションを実行するコンポーネントがYAESS(やえす)。
|
|
YAESSは、AsakusaFWで作ったアプリケーションを実行する為のコンポーネント(シェルなど)。
YAESSは「Yet Another Experimental Shell Script」から付けられた名前だそうだ。(でも東京の八重洲を連想してしまうw)
YAESS登場以前(AsakusaFW 0.2.3より前)は、Asakusaアプリを実行する為に生成されるものは「experimental.sh」というシェルだった。
ただ、experimental.shは「experimental(実験的)」という名前の通り、とりあえず実行してみる際に使うもので、正式な運用に使うものではない。その為にYAESSが用意されたっぽい。
YAESSはAsakusaアプリケーションの実行情報の生成機能およびその実行情報を使って実行するシェルを提供している。
実行情報はYAESS専用のプロパティーファイルだが、JP1やA-AUTO等のジョブ管理ツールと連携させる為にJSON形式で生成することも出来る。
YAESSを使ってAsakusaアプリケーションを実行する為には、運用環境にAsakusaアプリケーションを配置(デプロイ)しておく必要がある。[/2015-07-04]
YAESSを実行するシェルの中で$ASAKUSA_HOME/yaess/conf/env.shが呼ばれるので、そこに環境変数を定義しておくことが出来る。[2014-01-25]
EMRでAsakusaアプリを実行する場合は、ASAKUSA_HOME一式をマスターノードに配置し、そこでYAESSを実行することが多いと思う。
しかしEMRのマスターノードでは最小限の環境変数しか無いので、Asakusaアプリの実行に必要な環境変数を別途定義する必要がある。そこで、env.shを使用する。
マスターノードの/home/hadoopの下にasakusaというディレクトリー名でASAKUSA_HOME一式を配置したとすると、env.shに以下のような環境変数を定義しておくとよい。
export TZ=JST-9 export ASAKUSA_HOME=/home/hadoop/asakusa
※環境変数TZをJST-9に設定しておくと、YAESSのログに出力される時刻が日本時間になる(→EMRのタイムゾーン)
AsakusaFW 0.7.4では、YAESSの引数で環境変数を渡すことも出来る。[2015-08-11]
Asakusaアプリケーションの実行方法。
$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh バッチID
yaess-batch.shを使用し、バッチIDを指定する。
バッチIDは、Batch DSLにおいて@Batchアノテーションで付けた名前となる。($ASAKUSA_HOME/batchappsの下のディレクトリー名とも同じ)
バッチ引数は「-A」で指定する。
$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh バッチID -A 引数1=値1 -A 引数2=値2
Asakusa on Sparkの反復バッチ用引数は「-X-parameter-table」で指定する。[2016-04-10]
AsakusaFW 0.7.4ではYAESSの引数で環境変数を渡すことが出来る。[2015-08-11]
(つまり、env.shに書かなくても渡せるということ)
$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh バッチID -V 環境変数名1=値1
AsakusaFW 0.4.0でシミュレーションモード(ドライラン)が加わった。
実際のMapReduceは実行せず、設定が正しいかどうかだけ確認する動作モード。
実行する環境を作ったら、まずはシミュレーションモードでYAESSを実行し、それでOKだったら実際のデータを使って実行すると良い。
$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh バッチID -D dryRun 2>&1 | tee /tmp/log.txt
AsakusaFW 0.7.4でプロファイルセットをYAESSの実行時に指定することが出来るようになった。[2015-08-11]
プロファイルセット(構成ファイル)というのは「$ASAKUSA_HOME/yaess/conf/
」の下にあるファイルのこと。デフォルトでは「yaess.properties
」。
0.7.4より前は、異なる設定のプロファイルセットを用意したくても、実行時に切り替える方法が無かった。(無理矢理やるなら、yaess-batch.shを直接書き換えるとか、yaess.propertiesのファイル自身を切り替えるとか…)
YAESSの引数「-D profile=
プロファイルセット名」でプロファイルセットを指定できる。
例えば「$ASAKUSA_HOME/yaess/conf/custom-profile.properties
」を使いたい場合は以下の様にする。
$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh バッチID -D profile=custom-profile
YAESSの実行時に遭遇したエラー。
ERROR [YS-BOOTSTRAP-E00002] Failed to initialize plug-ins: Configuration [mode=BATCH, batchId=バッチID]
java.io.IOException: Failed to resolve the profile "lock.directory": ${ASAKUSA_HOME}/yaess/var/lock
at java.lang.Throwable.<init>(libgcj.so.10) ~[na:na]
at java.lang.Throwable.<init>(libgcj.so.10) ~[na:na]
at java.lang.Exception.<init>(libgcj.so.10) ~[na:na]
at com.asakusafw.yaess.basic.BasicLockProvider.prepareDirectory(BasicLockProvider.java:69) ~[asakusa-yaess-core-0.2.jar:na]
at com.asakusafw.yaess.basic.BasicLockProvider.doConfigure(BasicLockProvider.java:50) ~[asakusa-yaess-core-0.2.jar:na]
at com.asakusafw.yaess.core.ExecutionLockProvider.configure(ExecutionLockProvider.java:46) ~[asakusa-yaess-core-0.2.jar:na]
at com.asakusafw.yaess.core.ServiceProfile.newInstance(ServiceProfile.java:146) ~[asakusa-yaess-core-0.2.jar:na]
at com.asakusafw.yaess.core.task.ExecutionTask.load(ExecutionTask.java:199) ~[asakusa-yaess-core-0.2.jar:na]
at com.asakusafw.yaess.bootstrap.Yaess.execute(Yaess.java:157) [asakusa-yaess-bootstrap-0.2.jar:na]
at com.asakusafw.yaess.bootstrap.Yaess.main(Yaess.java:128) [asakusa-yaess-bootstrap-0.2.jar:na]
Caused by: java.lang.IllegalArgumentException: parameter "ASAKUSA_HOME" is not defined in the list: {}
at com.asakusafw.yaess.core.VariableResolver.replace(VariableResolver.java:93) ~[asakusa-yaess-core-0.2.jar:na]
at com.asakusafw.yaess.basic.BasicLockProvider.prepareDirectory(BasicLockProvider.java:67) ~[asakusa-yaess-core-0.2.jar:na]
... 6 common frames omitted
INFO [YS-BOOTSTRAP-I00999] Exiting YAESS: code=1, elapsed=42ms
ASAKUSA_HOMEが定義されていないというエラーだが、ちゃんと定義されてるんだが。
環境変数ASAKUSA_HOMEが本当に定義されていない場合は、そもそも実行自体が出来ない。
$ /home/hishidama/asakusa-develop/asakusa/yaess/bin/yaess-batch.sh バッチID $ASAKUSA_HOME is not defined
このエラーは、javaコマンドがGCJ(GNU Compiler for Java)版だと発生するらしい。
(AsakusaFWやHadoopは純正JDKが対象。OpenJDKでも開発できるけど)
$ java -version ←Javaのバージョン確認
java version "1.5.0"
gij (GNU libgcj) version 4.4.6 20110731 (Red Hat 4.4.6-3)
# alternatives --display java ←javaコマンドがどのバージョンを指しているかの確認
java - status is auto.
link currently points to /usr/lib/jvm/jre-1.5.0-gcj/bin/java
/usr/lib/jvm/jre-1.5.0-gcj/bin/java - priority 1500
slave jre: /usr/lib/jvm/jre-1.5.0-gcj
slave jre_exports: /usr/lib/jvm-exports/jre-1.5.0-gcj
slave keytool: /usr/lib/jvm/jre-1.5.0-gcj/bin/keytool
slave rmiregistry: /usr/lib/jvm/jre-1.5.0-gcj/bin/rmiregistry
Current `best' version is /usr/lib/jvm/jre-1.5.0-gcj/bin/java.
CentOSでは、何かをインストールすると、依存ライブラリーとしてGCJがインストールされることがよくあるらしい(苦笑)
(今回はPostgreSQLを入れたら一緒に入ったようだorz)
という訳で、純正JDKに変更してやればよい。
JDKを自分でインストールしている場合はalternativesにその設定は入っていないので、設定してやる。
# alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_26/bin/java 2000 ←数値はgcj(今回は1500)より大きなものを適当に
# alternatives --display java
java - status is auto.
link currently points to /usr/java/jdk1.6.0_26/bin/java
/usr/lib/jvm/jre-1.5.0-gcj/bin/java - priority 1500
slave keytool: /usr/lib/jvm/jre-1.5.0-gcj/bin/keytool
slave rmiregistry: /usr/lib/jvm/jre-1.5.0-gcj/bin/rmiregistry
slave jre_exports: /usr/lib/jvm-exports/jre-1.5.0-gcj
slave jre: /usr/lib/jvm/jre-1.5.0-gcj
/usr/java/jdk1.6.0_26/bin/java - priority 2000
slave keytool: (null)
slave rmiregistry: (null)
slave jre_exports: (null)
slave jre: (null)
Current `best' version is /usr/java/jdk1.6.0_26/bin/java.
# java -version
java version "1.6.0_26"
参考:torutkさんのalternativesによるGCJとSun JDKの切り替え
/home/hishidama/asakusa/yaess-hadoop/libexec/hadoop-execute.sh: line 78: cd: HOME not set
環境変数HOMEが定義されていない。[2017-02-11]
(ツールからssh経由とかでYAESSを起動する場合、環境変数が初期化されていないことがある)
hadoop-execute.shで起きているので、yaess.propertiesのhadoopの項で環境変数を定義してやるとよい。
(WindGateを使っていると、クリーンナップ処理でhadoop-execute.shが使われる)
## local direct execution hadoop = com.asakusafw.yaess.basic.BasicHadoopScriptHandler hadoop.resource = hadoop-master hadoop.env.HADOOP_CMD = /usr/bin/hadoop hadoop.env.HOME = ${HOME-/home/hishidama}
※yaess.propertiesで${環境変数名-デフォルト値}
と書くと、環境変数が定義されていればその値、無ければデフォルト値が使われる。
もしくは、ASAKUSA_HOME/yaess/conf/env.shに環境変数HOMEを定義しておくという方法もある。
Starting Asakusa Hadoop:
Hadoop Command: /usr/bin/hadoop
App Library: /home/hishidama/asakusa/batchapps/ExampleBatch/lib/jobflow-ExampleJob.jar
Batch ID: ExampleBatch
Flow ID: ExampleJob
Execution ID: 50ea330d-74dc-4891-95a1-cc4fc6afbebd
Class: com.asakusafw.runtime.stage.CleanupStageClient
17/02/11 10:49:57 ERROR launcher.ApplicationLauncher: Exception occurred in launcher: com.asakusafw.runtime.stage.CleanupStageClient[]
java.lang.IllegalStateException: Missing a mandatory configuration "com.asakusafw.user"
〜
YAESS Hadoop failed with exit code: 255
com.asakusafw.userが定義されていない。[2017-02-11]
これは環境変数USERの値が渡される。
(ツールからssh経由とかでYAESSを起動する場合、環境変数が初期化されていないことがある)
hadoopコマンドで起きているので、yaess.propertiesのhadoopの項で環境変数を定義してやるとよい。
(WindGateを使っていると、クリーンナップ処理でhadoopが使われる)
## local direct execution hadoop = com.asakusafw.yaess.basic.BasicHadoopScriptHandler hadoop.resource = hadoop-master hadoop.env.HADOOP_CMD = /usr/bin/hadoop hadoop.env.USER = ${USER-hishidama}
※yaess.propertiesで${環境変数名-デフォルト値}
と書くと、環境変数が定義されていればその値、無ければデフォルト値が使われる。
もしくは、ASAKUSA_HOME/yaess/conf/env.shに環境変数USERを定義しておくという方法もある。