Asakusa Vanilla リファレンス¶
この文書では、Asakusa Vanilla が提供するGradle PluginやDSLコンパイラの設定、およびバッチアプリケーション実行時の設定などについて説明します。
Asakusa Vanilla Gradle Plugin リファレンス¶
Asakusa Vanilla Gradle Pluginが提供する機能とインターフェースについて個々に解説します。
プラグイン¶
asakusafw-vanillaアプリケーションプロジェクトで、Asakusa Vanillaのさまざまな機能を有効にする。
このプラグインは
asakusafw-sdkプラグインやasakusafw-organizerプラグインを拡張するように作られているため、それぞれのプラグインも併せて有効にする必要がある(apply plugin: 'asakusafw-vanilla'だけではほとんどの機能を利用できません)。
タスク¶
vanillaCompileBatchappsDSL Compiler for Vanillaを利用してDSLをコンパイルする [1] 。
asakusafw-sdkプラグインが有効である場合にのみ利用可能。attachComponentVanillaデプロイメントアーカイブにAsakusa Vanilla向けのバッチアプリケーションを実行するためのコンポーネントを追加する。
asakusafw-organizerプラグインが有効である場合にのみ利用可能。asakusafwOrganizer.vanilla.enabledにtrueが指定されている場合、自動的に有効になる。attachVanillaBatchappsデプロイメントアーカイブに
vanillaCompileBatchappsでコンパイルした結果を含める。asakusafw-sdk,asakusafw-organizerの両プラグインがいずれも有効である場合にのみ利用可能。asakusafwOrganizer.batchapps.enabledにtrueが指定されている場合、自動的に有効になる。
| [1] | com.asakusafw.gradle.tasks.AsakusaCompileTask |
タスク拡張¶
assembleデプロイメントアーカイブを生成する。
asakusafw-vanillaとasakusafw-organizerプラグインがいずれも有効である場合、vanillaCompileBatchappsが依存関係に追加される。compileBatchappAsakusa DSLコンパイラを使ってバッチアプリケーションのコンパイルを行い、実行可能モジュールを生成する。
asakusafw-vanillaプラグインが有効である場合、vanillaCompileBatchappsが依存関係に追加される。jarBatchappcompileBatchappタスクで生成したバッチアプリケーションを含むjarファイルを生成する。asakusafw-vanillaプラグインが有効である場合、vanillaCompileBatchappsタスクの生成物がjarファイルの内容に追加される。
規約プロパティ拡張¶
Batch Application Plugin ( asakusafw ) への拡張¶
Asakusa Vanilla Gradle PluginはBatch Application Pluginに対してAsakusa Vanillaのビルド設定を行うための規約プロパティを追加します。この規約プロパティは、 asakusafw ブロック内の参照名 vanilla でアクセスできます。
以下、 build.gradle の設定例です。
asakusafw {
vanilla {
include 'com.example.batch.*'
}
}
この規約オブジェクトは以下のプロパティを持ちます。
vanilla.versionAsakusa Vanilla のコンポーネントバージョンを保持する。
この値は設定による変更は不可。
既定値: Asakusa Vanilla Gradle Pluginが保持する既定のバージョン
vanilla.outputDirectoryコンパイラの出力先を指定する。
文字列や
java.io.Fileなどで指定し、相対パスが指定された場合にはプロジェクトからの相対パスとして取り扱う。既定値:
"$buildDir/vanilla-batchapps"vanilla.includeコンパイルの対象に含めるバッチクラス名のパターンを指定する。
バッチクラス名には
*でワイルドカードを含めることが可能。また、バッチクラス名のリストを指定した場合、それらのパターンのいずれかにマッチしたバッチクラスのみをコンパイルの対象に含める。
既定値:
null(すべて)vanilla.excludeコンパイルの対象から除外するバッチクラス名のパターンを指定する。
バッチクラス名には
*でワイルドカードを含めることが可能。また、バッチクラス名のリストを指定した場合、それらのパターンのいずれかにマッチしたバッチクラスをコンパイルの対象から除外する。
includeとexcludeがいずれも指定された場合、excludeのパターンを優先して取り扱う。既定値:
null(除外しない)vanilla.runtimeWorkingDirectory実行時のテンポラリワーキングディレクトリのパスを指定する。
パスにはURIやカレントワーキングディレクトリからの相対パスを指定可能。
未指定の場合、コンパイラの標準設定である「
target/hadoopwork」を利用する。既定値:
null(コンパイラの標準設定を利用する)vanilla.optionコンパイラプロパティ (コンパイラのオプション設定)を追加する。
後述する コンパイラプロパティ を
<key>, <value>の形式で指定する [2] 。既定値: (Asakusa Vanilla向けのコンパイルに必要な最低限のもの)
vanilla.batchIdPrefixAsakusa Vanilla向けのバッチアプリケーションに付与するバッチIDの接頭辞を指定する。
文字列を設定すると、それぞれのバッチアプリケーションは「
<接頭辞><本来のバッチID>」というバッチIDに強制的に変更される。空文字や
nullを指定した場合、本来のバッチIDをそのまま利用するが、他のコンパイラが生成したバッチアプリケーションと同じバッチIDのバッチアプリケーションを生成した場合、アプリケーションが正しく動作しなくなる。既定値:
"vanilla."vanilla.failOnErrorAsakusa Vanilla向けのコンパイルを行う際に、コンパイルエラーが発生したら即座にコンパイルを停止するかどうかを選択する。
コンパイルエラーが発生した際に、
trueを指定した場合にはコンパイルをすぐに停止し、falseを指定した場合には最後までコンパイルを実施する。既定値:
true(即座にコンパイルを停止する)
| [2] | コンパイラプロパティを指定する方法は他にいくつかの方法があります。詳しくは com.asakusafw.gradle.plugins.AsakusafwCompilerExtension のメソッドの説明を参照してください。 |
Framework Organizer Plugin ( asakusafwOrganizer ) への拡張¶
Asakusa Vanilla Gradle Plugin は Framework Organizer Plugin に対してAsakusa Vanillaのビルド設定を行うための規約プロパティを追加します。この規約プロパティは、 asakusafwOrganizer ブロック内の参照名 vanilla でアクセスできます。
この規約オブジェクトは以下のプロパティを持ちます。
vanilla.enabledデプロイメントアーカイブにAsakusa Vanillaのコンポーネント群を追加するかどうかを指定する。
trueを指定した場合にはコンポーネントを追加し、falseを指定した場合には追加しない。既定値:
true(コンポーネント群を追加する)<profile>.vanilla.enabled対象のプロファイルに対し、デプロイメントアーカイブにAsakusa Vanillaのコンポーネントを追加するかどうかを指定する。
前述の
vanilla.enabledと同様だが、こちらはプロファイルごとに指定できる。既定値:
asakusafwOrganizer.vanilla.enabled(全体のデフォルト値を利用する)
コマンドラインオプション¶
vanillaCompileBatchapps タスクを指定して gradlew コマンドを実行する際に、 vanillaCompileBatchapps --update <バッチクラス名> と指定することで、指定したバッチクラス名のみをバッチコンパイルすることができます。
また、バッチクラス名の文字列には * をワイルドカードとして使用することもできます。
以下の例では、パッケージ名に com.example.target.batch を含むバッチクラスのみをバッチコンパイルしてデプロイメントアーカイブを作成しています。
./gradlew vanillaCompileBatchapps --update com.example.target.batch.* assemble
そのほか、 vanillaCompileBatchapps タスクは gradlew コマンド実行時に以下のコマンドライン引数を指定することができます。
-
--options<k1=v1[,k2=v2[,...]]>¶ 追加のコンパイラプロパティを指定する。
規約プロパティ
asakusafw.vanilla.optionで設定したものと同じキーを指定した場合、それらを上書きする。
-
--batch-id-prefix<prefix.>¶ 生成するバッチアプリケーションに、指定のバッチID接頭辞を付与する。
規約プロパティ
asakusafw.vanilla.batchIdPrefixの設定を上書きする。
-
--fail-on-error<"true"|"false">¶ コンパイルエラー発生時に即座にコンパイル処理を停止するかどうか。
規約プロパティ
asakusafw.vanilla.failOnErrorの設定を上書きする。
-
--update<batch-class-name-pattern>¶ 指定のバッチクラスだけをコンパイルする (指定したもの以外はそのまま残る)。
規約プロパティ
asakusafw.vanilla.{in,ex}cludeと同様にワイルドカードを利用可能。このオプションが設定された場合、規約プロパティ
asakusafw.vanilla.{in,ex}cludeの設定は無視する。
DSL Compiler for Vanilla リファレンス¶
コンパイラプロパティ¶
DSL Compiler for Vanillaで利用可能なコンパイラプロパティについて説明します。
これらの設定方法については、 Batch Application Plugin ( asakusafw ) への拡張 の vanilla.option の項を参照してください。
directio.input.filter.enabledDirect I/O input filterを有効にするかどうか。
trueならば有効にし、falseならば無効にする。既定値:
trueoperator.checkpoint.removeDSLで指定した
@Checkpoint演算子をすべて除去するかどうか。trueならば除去し、falseならば除去しない。既定値:
falseoperator.logging.levelDSLで指定した
@Logging演算子のうち、どのレベル以上を表示するか。debug,info,warn,errorのいずれかを指定する。既定値:
infooperator.aggregation.defaultDSLで指定した
@Summarize,@Fold演算子のpartialAggregateにPartialAggregation.DEFAULTが指定された場合に、どのように集約を行うか。totalであれば部分集約を許さず、partialであれば部分集約を行う。既定値:
totalinput.estimator.tinyインポーター記述の
getDataSize()にDataSize.TINYが指定された際、それを何バイトのデータとして見積もるか。値にはバイト数か、
+Inf(無限大)、NaN(不明) のいずれかを指定する。主に、
@MasterJoin系の演算子でJOINのアルゴリズムを決める際など、データサイズによる最適化の情報として利用される。既定値:
10485760(10MB)input.estimator.smallインポーター記述の
getDataSize()にDataSize.SMALLが指定された際、それを何バイトのデータとして見積もるか。その他については
input.estimator.tinyと同様。既定値:
209715200(200MB)input.estimator.largeインポーター記述の
getDataSize()にDataSize.LARGEが指定された際、それを何バイトのデータとして見積もるか。その他については
input.estimator.tinyと同様。既定値:
+Inf(無限大)operator.join.broadcast.limit@MasterJoin系の演算子で、broadcast joinアルゴリズムを利用して結合を行うための、マスタ側の最大入力データサイズ。基本的には
input.estimator.tinyで指定した値の2倍程度にしておくのがよい。既定値:
20971520(20MB)operator.estimator.<演算子注釈名>指定した演算子の入力に対する出力データサイズの割合。
「演算子注釈名」には演算子注釈の単純名 (
Extract,Foldなど) を指定し、値には割合 (1.0,2.5など) を指定する。たとえば、「
operator.estimator.CoGroup」に5.0を指定した場合、すべての@CoGroup演算子の出力データサイズは、入力データサイズの合計の5倍として見積もられる。既定値: operator.estimator.* のデフォルト値 を参照
<バッチID>:<オプション名>指定のオプションを、指定のIDのバッチに対してのみ有効にする。
バッチIDは
vanilla.などのプレフィックスが付与する まえの ものを指定する必要がある。既定値: N/A
dag.planning.option.unifySubplanIo等価なステージの入出力を一つにまとめる最適化を有効にするかどうか。
trueならば有効にし、falseならば無効にする。無効化した場合、ステージの入出力データが増大する場合があるため、特別な理由がなければ有効にするのがよい。
既定値:
truedag.planning.option.checkpointAfterExternalInputsジョブフローの入力の直後にチェックポイント処理を行うかどうか。
trueならばチェックポイント処理を行い、falseならば行わない。既定値:
false
operator.estimator.* のデフォルト値¶
| 演算子注釈名 | 計算式 |
|---|---|
Checkpoint |
入力の 1.0 倍 |
Logging |
入力の 1.0 倍 |
Branch |
入力の 1.0 倍 |
Project |
入力の 1.0 倍 |
Extend |
入力の 1.25 倍 |
Restructure |
入力の 1.25 倍 |
Split |
入力の 1.0 倍 |
Update |
入力の 2.0 倍 |
Convert |
入力の 2.0 倍 |
Summarize |
入力の 1.0 倍 |
Fold |
入力の 1.0 倍 |
MasterJoin |
トランザクション入力の 2.0 倍 |
MasterJoinUpdate |
トランザクション入力の 2.0 倍 |
MasterCheck |
トランザクション入力の 1.0 倍 |
MasterBranch |
トランザクション入力の 1.0 倍 |
Extract |
既定値無し |
GroupSort |
既定値無し |
CoGroup |
既定値無し |
既定値がない演算子に対しては、有効なデータサイズの見積もりを行いません。
実行時の設定¶
Asakusa Vanillaのバッチアプリケーション実行時の設定は、 設定ファイル を使う方法と 環境変数 を使う方法があります。
設定ファイル¶
Asakusa Vanillaに関するバッチアプリケーション実行時のパラメータは、 $ASAKUSA_HOME/vanilla/conf/vanilla.properties に記述します。
このファイルは、 Asakusa Vanilla ユーザーガイド - デプロイメントアーカイブの作成 の設定を行った状態でデプロイメントアーカイブを作成した場合にのみ含まれています。
このファイルに設定した内容はAsakusa Vanillaのバッチアプリケーションの設定として使用され、バッチアプリケーション実行時の動作に影響を与えます。
環境変数¶
Asakusa Vanillaに関するバッチアプリケーション実行時のパラメータは、環境変数 ASAKUSA_VANILLA_ARGS に設定することもできます。
環境変数 ASAKUSA_VANILLA_ARGS の値には --engine-conf <key>=<value> という形式でパラメータを設定します。
設定ファイルと環境変数で同じプロパティが設定されていた場合、環境変数の設定値が利用されます。
設定項目¶
Asakusa Vanillaのバッチアプリケーション実行時の設定項目は以下の通りです。
com.asakusafw.vanilla.thread.maxタスクを実行するワーカースレッドの最大数を設定します。
既定値:
1com.asakusafw.vanilla.partitionsscatter-gather操作(シャッフル操作)のパーティション数を設定します。
既定値: (ワーカースレッドの最大数)
Hint
Asakusa Vanillaの現在の実装では、パーティション数をワーカースレッド数よりも大きな値にするメリットはほとんどありません。
com.asakusafw.vanilla.pool.sizeエンジン内で利用可能な入出力バッファーの合計サイズを設定します。
この値を超えるバッファーを利用しようとした場合、古いバッファーをファイルシステム上に書き出します。
既定値:
268435456(256MB)Hint
Asakusa Vanillaでは上記のバッファーをJVMのヒープ外に確保します。 そのため、Java VMの設定でヒープサイズの上限を指定しても、それとは 別に バッファー用のメモリを消費します。
com.asakusafw.vanilla.pool.swap古いバッファーをファイルシステム上に待避する際のファイルシステムパスを設定します。
指定したパスの配下に一時ディレクトリを作成し、そこにバッファーファイルを作成します。
既定値: (システムの一時ディレクトリー)
com.asakusafw.vanilla.pool.compression古いバッファーをファイルシステム上に待避する際の、ファイルの圧縮形式を指定します。
以下のいずれかの値を指定可能です。
com.asakusafw.vanilla.core.io.BufferedByteChannelDecorator- ファイルを圧縮せず、入出力のバッファリングのみを行います。
com.asakusafw.vanilla.core.io.NullByteChannelDecorator- ファイルを圧縮せず、入出力のバッファリングも行いません。
com.asakusafw.vanilla.client.util.SnappyByteChannelDecorator- ファイルをSnappy形式で圧縮します。
com.asakusafw.vanilla.client.util.Lz4ByteChannelDecoratorファイルをLZ4形式で圧縮します。
LZ4形式を利用する場合、LZ4ライブラリ lz4-java をVanilla実行環境のクラスパスに配置する必要があります。 以下、lz4-java を含めたデプロイメントアーカイブを生成する
build.gradleの設定例です。build.gradle¶configurations { lz4 } dependencies { lz4 group: 'org.lz4', name: 'lz4-java', version: '1.5.1' } asakusafwOrganizer { assembly.into('vanilla/lib') { put configurations.lz4 } }
既定値:
com.asakusafw.vanilla.core.io.BufferedByteChannelDecoratorcom.asakusafw.vanilla.output.buffer.size出力バッファーあたりのバイト数を設定します。
各出力が、この値から後述の「出力バッファのマージン値」を引いた値(
com.asakusafw.vanilla.output.buffer.size-com.asakusafw.vanilla.output.buffer.margin)を超えた場合、次のバッファーを新たに確保して出力を続行します。既定値:
4194304(4MB)Hint
古いバッファーをファイルシステム上に待避する際、各ファイルのサイズはおよそここで指定したサイズ以下になります。
com.asakusafw.vanilla.output.buffer.margin出力バッファーのマージンとなるバイト数を設定します。
この値は実行時に取り扱う最大レコードサイズよりも大きな値を設定すべきです。
また、この値は
com.asakusafw.vanilla.output.buffer.sizeの1/2より小さい値を設定してください。 最大レコードサイズが大きいことでこれが満たせない場合、com.asakusafw.vanilla.output.buffer.sizeの値を調整してください。既定値:
1048576(1MB)com.asakusafw.vanilla.output.record.sizeレコードサイズの推定平均バイト数を設定します。
この値は、出力バッファー当たりの最大レコード数を算出するために利用します。
既定値:
64Hint
この値を大きくしすぎると、出力バッファーサイズを大きくしてもバッファー当たりのレコード数がすぐに上限に達してしまい、バッファーを有効活用できなくなります。 また、この値を小さくしすぎると、出力バッファーごとのレコード管理のためのメタデータが大きくなりすぎてしまいます。
出力バッファーサイズに極端に大きな値を指定する場合や、消費メモリー量を細かく制御したい場合を除き、この設定を変更する必要はありません。
com.asakusafw.vanilla.merge.threshold各スレッド毎の、scatter-gather操作でマージ処理を行う際の入力チャンク数を指定します。
入力チャンク数がこの値を超過する場合、この値と後述の
com.asakusafw.vanilla.merge.factorの値に従い、入力チャンクに対して段階的にマージ処理を行います。既定値:
0(段階的マージを無効とし、すべての入力チャンクを一度にマージする)com.asakusafw.vanilla.merge.factor上記
com.asakusafw.vanilla.merge.thresholdの設定に従って段階的マージを行う際に、マージ処理の対象となるファイル数を決定する係数を設定します。マージが実行される際には
com.asakusafw.vanilla.merge.threshold*com.asakusafw.vanilla.merge.factorで算出されたファイル数を一度にマージします。既定値:
0.75com.asakusafw.dag.input.file.directory演算子リファレンス - 巨大な入力グループへの対応 などを利用してメモリ上のバッファをファイルとして退避する際に使用する、 ファイルの出力先ディレクトリを設定します。
既定値: なし (未指定の場合、JVMのシステムプロパティ
java.io.tmpdirで設定されているディレクトリを利用)Attention
大量のバッファが出力されるような処理を実行する場合には、出力先に十分な空き領域を確保する必要があることに注意してください。
hadoop.<name>指定の
<name>を名前に持つHadoopの設定を追加します。Hint
Asakusa Vanillaでは、一部の機能 (Direct I/Oなど) にHadoopのライブラリ群を利用しています。 このライブラリ群がHadoopの設定を参照している場合、この項目を利用して設定値を変更できます。
Asakusa全体に関するHadoopの設定は
$ASAKUSA_HOME/core/conf/asakusa-resources.xml内で行えますが、 同一の項目に対する設定がasakusa-resources.xmlとhadoop.<name>の両方に存在する場合、後者の設定値を優先します。
Java VMの設定¶
Asakusa Vanillaでバッチアプリケーションを実行する際には、Java VMをひとつ起動してそのプロセス内でAsakusaの演算子を実行します。
このとき、対象のJava VMを起動する際のオプション引数を、環境変数 ASAKUSA_VANILLA_OPTS で指定できます。
以下は環境変数の設定例です。
export ASAKUSA_VANILLA_OPTS='-Xmx16g'
実行コマンドの設定¶
Asakusa Vanilla実行用のJVMプロセスを起動するJavaコマンドは、環境変数 JAVA_CMD で設定することができます。
JAVA_CMD が未設定の場合、 PATH 環境変数に含まれる java コマンドが使用されます。
Framework Organizer Plugin ( asakusafwOrganizer ) への拡張 で vanilla.useSystemHadoop が true になっている場合、
Asakusa Vanilla実行用のJVMプロセスを起動するコマンドには hadoop コマンドが使用され、
このコマンドは環境変数 HADOOP_CMD で設定することができます。
HADOOP_CMD が未設定の場合、 PATH 環境変数に含まれる hadoop コマンドが使用されます。
環境変数 ASAKUSA_VANILLA_LAUNCHER は実行コマンドの先頭に任意のコマンド文字列を追加します。
Tip
バッチアプリケーション実行時の環境変数は、YAESSプロファイルで設定することも可能です。
Asakusa Vanillaを利用する場合、コマンドラインジョブのプロファイル command.vanilla が利用できます。 $ASAKUSA_HOME/yaess/conf/yaess.properties に command.vanilla.env.HADOOP_CMD といったような設定を追加することで、YAESSからAsakusa Vanillaを実行する際に環境変数が設定されます。
YAESSのコマンドラインジョブの設定方法について詳しくは、 YAESSユーザーガイド - コマンドラインジョブの実行 などを参照してください。
ログの設定¶
Asakusa Vanillaの実行時のログ設定は、Logback設定ファイル $ASAKUSA_HOME/vanilla/conf/logback.xml で設定します。
WindGate JDBC ダイレクト・モード¶
Asakusa on M3BP 向けの機能として提供しているWindGate JDBC ダイレクト・モードはAsakusa Vanillaからも利用することができます。
WindGate JDBC ダイレクト・モードを利用するには、アプリケーションプロジェクトのビルドスクリプト( build.gradle )にこのモードを利用するためのコンパイルオプションを指定します。
以下、 build.gradle の設定例です。
asakusafw {
vanilla {
option 'windgate.jdbc.direct', '*'
}
}
WindGate JDBC ダイレクト・モードの利用方法などについては、Asakusa on M3BP の以下のドキュメントを参照してください。