Asakusa FrameworkのWindGateのでプロファイルのメモ。
|
WindGateを使う場合、具体的なアクセス先をWindGateプロファイルに記述する。
WindGate用Importer/Exporterクラスには、プロファイル名を指定する。
WindGate用Importer/ExporterクラスのgetProfileNameメソッドでプロファイル名を指定する。
/**
* 売上明細インポーター
*/
public class SalesDetailFromTable extends AbstractSalesDetailJdbcImporterDescription {
@Override
public String getProfileName() {
return "asakusa";
}
@Override
public DataSize getDataSize() {
return DataSize.LARGE;
}
}
/**
* 売上明細エクスポーター
*/
public class SalesDetailToTable extends AbstractSalesDetailJdbcExporterDescription {
@Override
public String getProfileName() {
return "asakusa";
}
}
getProfileNameメソッドに指定したプロファイル名が「asakusa」の場合、実行環境の「$ASAKUSA_HOME/windgate/profile/asakusa.properties」が実行時に読み込まれる。
プロファイル名は、JDBCアクセスの場合はRDBのDB名やホスト名等を使うのが分かりやすい気がする。
実行マシン上のローカルのCSVファイルにアクセスする場合、プロファイルは以下のように記述する。
## Core
core.maxProcesses=4
## Resources
# Local File System
resource.local=com.asakusafw.windgate.stream.file.FileResourceProvider
resource.local.basePath=/tmp/windgate-${USER}
# Hadoop File System
resource.hadoop=com.asakusafw.windgate.hadoopfs.HadoopFsProvider
resource.hadoop.basePath=hdfs://localhost/user/${USER}
## Session
session=com.asakusafw.windgate.file.session.FileSessionProvider
session.directory=${ASAKUSA_HOME}/windgate/var/session/${WINDGATE_PROFILE}
## Process
process.basic=com.asakusafw.windgate.core.process.BasicProcessProvider
「resource.local.basePath」にローカルファイルシステムのパス(ディレクトリー)を指定する。
「resource.hadoop」にHDFSを指定する。
(WindGate Importerの場合、ローカルファイルを読み込んでHDFSに中間ファイルを出力する。
WindGate Exporterの場合、HDFS上の中間ファイルを読み込んでローカルファイルに出力する。
いずれにしてもHDFSにアクセスする必要があるので、HDFSの指定は必要となる。
別のマシン上にあるHDFSをssh経由でアクセスする場合は、WindGate SSHの設定を行う)
RDBにJDBCアクセスする場合、プロファイルは以下のように記述する。
(M3BPのWindGate
JDBCダイレクトモードの場合は、このプロファイルは使用しない。→M3BP
WindGate JDBCダイレクトモードのプロファイル記述方法)
## Core
core.maxProcesses=4
## Resources
# JDBC
resource.jdbc=com.asakusafw.windgate.jdbc.JdbcResourceProvider
resource.jdbc.driver=org.postgresql.Driver
resource.jdbc.url=jdbc:postgresql://localhost:5432/asakusa
resource.jdbc.user=asakusa
resource.jdbc.password=asakusa
resource.jdbc.batchGetUnit=1000
resource.jdbc.batchPutUnit=1000
resource.jdbc.connect.retryCount=3
resource.jdbc.connect.retryInterval=10
resource.jdbc.statement.truncate=TRUNCATE TABLE {0}
resource.jdbc.properties.loginTimeout=10
# Hadoop File System
resource.hadoop=com.asakusafw.windgate.hadoopfs.HadoopFsProvider
resource.hadoop.basePath=hdfs://localhost/user/${USER}
## Session
session=com.asakusafw.windgate.file.session.FileSessionProvider
session.directory=${ASAKUSA_HOME}/windgate/var/session/${WINDGATE_PROFILE}
## Process
process.basic=com.asakusafw.windgate.core.process.BasicProcessProvider
「resource.jdbc.driver」や「resource.jdbc.url」等に接続先のRDBに応じた設定をする。
(アクセス先テーブル名はImporter/Exporterクラスで指定する。デフォルトは@windgate.jdbcで指定したテーブル名)
このプロファイルを使ってRDBに出力する(Expoterで使用する)場合、出力先テーブルをクリアしてからINSERTすることになる。
このクリア方法を指定するのが「resource.jdbc.statement.truncate」。デフォルトではTRUNCATEでテーブルを一括削除するが、DELETE文
に変更するようなことも出来る。
実行時引数を使って特定条件のデータだけクリアしたいような場合は、ExporterクラスのgetCustomTruncateメソッドでDELETE文を生成することも出来る。
「resource.hadoop」にHDFSを指定する。
(WindGate Importerの場合、RDBのテーブルを読み込んでHDFSに中間ファイルを出力する。
WindGate Exporterの場合、HDFS上の中間ファイルを読み込んでRDBのテーブルに出力する。
いずれにしてもHDFSにアクセスする必要があるので、HDFSの指定は必要となる。
別のマシン上にあるHDFSをssh経由でアクセスする場合は、WindGate SSHの設定を行う)
WindGateプロファイル内には以下のような指定がある。
〜
## Session
session=com.asakusafw.windgate.file.session.FileSessionProvider
session.directory=${ASAKUSA_HOME}/windgate/var/session/${WINDGATE_PROFILE}
〜
WindGateは、実行するときにロックする。
(何かの障害によってプロセスが生き残っているような場合に、同時に実行されないようにする為)
これにより、同じWindGateプロファイルを使う処理(バッチ)が同時に動かないようになっている。
このロックの仕組みを指定するのが「session」。
デフォルトでは、ローカルファイルを使ってロックするFileSessionProviderクラスが指定されている。
このクラスを使う場合のロックファイルの場所(ディレクトリー)を示すのが「session.directory」。
デフォルトでは$ASAKUSA_HOMEの下に作るようになっているが、もっと一時ファイルを作るに相応しい場所(「/tmp」等)にしておく方がよいかもしれない。
同じプロファイルを使うバッチを複数同時に実行すると、ロックに引っかかって後から実行したバッチが失敗することがある。
同じバッチではあるがデータ基準日が異なるような(データがかぶらない)バッチを並列に実行したい場合、ロックディレクトリーを分けることで同時に実行できるようになる。
WindGateプロファイルでは環境変数が使える(ASAKUSA_HOMEやWINDGATE_PROFILEも環境変数である)ので、好きな環境変数を追加すればよい。
〜
## Session
session=com.asakusafw.windgate.file.session.FileSessionProvider
session.directory=${ASAKUSA_HOME}/windgate/var/session/${WINDGATE_PROFILE}-${LOCK_DATE}
$ export LOCK_DATE=20151126
$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh HogeBatch -A EXECUTE_DATE=20151126
YAESS SSHを使ってリモート先のHadoopクラスター上でバッチを実行する場合は、
YAESSの引数に-Vで変数を指定し、
yaess.properties内で実行先コマンドに環境変数を渡すよう指定する。
$ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh HogeBatch -V LOCK_DATE=20151126 -A EXECUTE_DATE=20151126
〜
command.* = com.asakusafw.yaess.jsch.SshCommandScriptHandler
command.*.ssh.user=asakusa
command.*.ssh.host=hogehost
command.*.ssh.port=22
command.*.ssh.privateKey=${HOME}/.ssh/id_dsa
command.*.ssh.passPhrase=
command.*.resource = asakusa
command.*.env.HADOOP_CMD = /usr/bin/hadoop
command.*.env.ASAKUSA_HOME = ${ASAKUSA_HOME}
command.*.env.LOCK_DATE = ${LOCK_DATE}
〜
## Session
session=com.asakusafw.windgate.file.session.FileSessionProvider
session.directory=${ASAKUSA_HOME}/windgate/var/session/${WINDGATE_PROFILE}-${LOCK_DATE}
WindGateのプロファイルでは、${ 〜 } で環境変数を使用することが出来る。[2016-12-14]
AsakusaFW 0.9.0以降では、プロファイル内で、環境変数名の後ろに「-」(ハイフン)を付けてデフォルト値(環境変数が定義されていなかった時に使われる値)を指定することも出来る。
(ハイフンで区切るというのは、bashをイメージしているらしい)
## Session
session=com.asakusafw.windgate.file.session.FileSessionProvider
session.directory=${ASAKUSA_HOME}/windgate/var/session/${WINDGATE_PROFILE-default}