S-JIS[2012-06-16/2017-02-11] 変更履歴

Asakusa Framework YAESS

Asakusa Frameworkにおいて、Asakusaアプリケーションを実行するコンポーネントがYAESS(やえす)。


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で実行する為の準備

YAESSを使ってAsakusaアプリケーションを実行する為には、運用環境にAsakusaアプリケーションを配置(デプロイ)しておく必要がある。[/2015-07-04]

運用環境へのAsakusaアプリケーションのデプロイ


YAESSに対する環境変数の設定

YAESSを実行するシェルの中で$ASAKUSA_HOME/yaess/conf/env.shが呼ばれるので、そこに環境変数を定義しておくことが出来る。[2014-01-25]

EMRの例

EMRでAsakusaアプリを実行する場合は、ASAKUSA_HOME一式をマスターノードに配置し、そこでYAESSを実行することが多いと思う。
しかしEMRのマスターノードでは最小限の環境変数しか無いので、Asakusaアプリの実行に必要な環境変数を別途定義する必要がある。そこで、env.shを使用する。

マスターノードの/home/hadoopの下にasakusaというディレクトリー名でASAKUSA_HOME一式を配置したとすると、env.shに以下のような環境変数を定義しておくとよい。

/home/hadoop/asakusa/yaess/conf/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]


YAESSでの実行

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のエラー

YAESSの実行時に遭遇したエラー。


GCJ(CentOS)

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が無い

/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が使われる)

ASAKUSA_HOME/yaess/conf/yaess.properties:

## 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を定義しておくという方法もある。


com.asakusafw.userが無い

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が使われる)

ASAKUSA_HOME/yaess/conf/yaess.properties:

## 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を定義しておくという方法もある。


AsakusaFW目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま