Asakusa on MapReduce リファレンス¶
この文書では、Asakusa on MapReduceが提供するGradle PluginやDSLコンパイラの設定、およびバッチアプリケーション実行時の設定などについて説明します。
Asakusa on MapReduce Gradle Plugin リファレンス¶
Asakusa on MapReduce Gradle Pluginが提供する機能とインターフェースについて個々に解説します。
プラグイン¶
asakusafw-mapreduceアプリケーションプロジェクトで、Asakusa on MapReduceのさまざまな機能を有効にする [1] 。
このプラグインは
asakusafw-sdkプラグインやasakusafw-organizerプラグインを拡張するように作られているため、それぞれのプラグインも併せて有効にする必要がある(apply plugin: 'asakusafw-mapreduce'だけではほとんどの機能を利用できません)。
| [1] | com.asakusafw.mapreduce.gradle.plugins.AsakusafwMapReducePlugin |
タスク¶
mapreduceCompileBatchappsAsakusa DSL Compiler for MapReduceを利用してDSLをコンパイルする [2] 。
asakusafw-sdkプラグインが有効である場合にのみ利用可能。attachComponentMapReduceデプロイメントアーカイブにMapReduce向けのバッチアプリケーションを実行するためのコンポーネントを追加する。
asakusafw-organizerプラグインが有効である場合にのみ利用可能。asakusafwOrganizer.mapreduce.enabledにtrueが指定されている場合、自動的に有効になる。attachMapReduceBatchappsデプロイメントアーカイブに
mapreduceCompileBatchappsでコンパイルした結果を含める。asakusafw-sdk,asakusafw-organizerの両プラグインがいずれも有効である場合にのみ利用可能。asakusafwOrganizer.batchapps.enabledにtrueが指定されている場合、自動的に有効になる。
| [2] | com.asakusafw.gradle.tasks.AsakusaCompileTask |
タスク拡張¶
assembleデプロイメントアーカイブを生成する。
asakusafw-mapreduceとasakusafw-organizerプラグインがいずれも有効である場合、mapreduceCompileBatchappsが依存関係に追加される。compileBatchappAsakusa DSLコンパイラを使ってバッチアプリケーションのコンパイルを行い、実行可能モジュールを生成する。
asakusafw-mapreduceプラグインが有効である場合、mapreduceCompileBatchappsが依存関係に追加される。jarBatchappcompileBatchappタスクで生成したバッチアプリケーションを含むjarファイルを生成する。asakusafw-mapreduceプラグインが有効である場合、mapreduceCompileBatchappsタスクの生成物がjarファイルの内容に追加される。
規約プロパティ拡張¶
Batch Application Plugin ( asakusafw ) への拡張¶
Asakusa on MapReduce Gradle Pluginは Batch Application Plugin に対して Asakusa on MapReduceのビルド設定を行うための規約プロパティを追加します。この規約プロパティは、 asakusafw ブロック内の参照名 mapreduce でアクセスできます [3] 。
以下、 build.gradle の設定例です。
asakusafw {
mapreduce {
include 'com.example.batch.*'
option 'hashJoinForTiny', 'false'
}
この規約オブジェクトは以下のプロパティを持ちます。
mapreduce.versionAsakusa on MapReduceのコンポーネントバージョンを保持する。
この値は設定による変更は不可。
既定値: Asakusa on MapReduce Gradle Pluginが保持する既定のバージョン
mapreduce.outputDirectoryコンパイラの出力先を指定する。
文字列や
java.io.Fileなどで指定し、相対パスが指定された場合にはプロジェクトからの相対パスとして取り扱う。既定値:
"$buildDir/batchc"mapreduce.includeコンパイルの対象に含めるバッチクラス名のパターンを指定する。
バッチクラス名には
*でワイルドカードを含めることが可能。また、バッチクラス名のリストを指定した場合、それらのパターンのいずれかにマッチしたバッチクラスのみをコンパイルの対象に含める。
既定値:
null(すべて)mapreduce.excludeコンパイルの対象から除外するバッチクラス名のパターンを指定する。
バッチクラス名には
*でワイルドカードを含めることが可能。また、バッチクラス名のリストを指定した場合、それらのパターンのいずれかにマッチしたバッチクラスをコンパイルの対象から除外する。
includeとexcludeがいずれも指定された場合、excludeのパターンを優先して取り扱う。既定値:
null(除外しない)mapreduce.runtimeWorkingDirectory実行時のテンポラリワーキングディレクトリのパスを指定する。
パスにはURIやカレントワーキングディレクトリからの相対パスを指定可能。
未指定の場合、コンパイラの標準設定である「
target/hadoopwork」を利用する。既定値:
null(コンパイラの標準設定を利用する)mapreduce.optionコンパイラプロパティ (コンパイラのオプション設定)を追加する。
後述する コンパイラプロパティ を
<key>, <value>の形式で指定する [4] 。既定値: (MapReduce向けのコンパイルに必要な最低限のもの)
mapreduce.failOnErrorMapReduce向けのコンパイルを行う際に、コンパイルエラーが発生したら即座にコンパイルを停止するかどうかを選択する。
コンパイルエラーが発生した際に、
trueを指定した場合にはコンパイルをすぐに停止し、falseを指定した場合には最後までコンパイルを実施する。既定値:
true(即座にコンパイルを停止する)
| [3] | これらのプロパティは規約オブジェクト com.asakusafw.gradle.plugins.AsakusafwCompilerExtension が提供します。 |
| [4] | コンパイラプロパティを指定する方法は他にいくつかの方法があります。詳しくは com.asakusafw.gradle.plugins.AsakusafwCompilerExtension のメソッドの説明を参照してください。 |
Framework Organizer Plugin ( asakusafwOrganizer ) への拡張¶
Asakusa on MapReduce Gradle Plugin は Framework Organizer Plugin に対して Asakusa on MapReduceのビルド設定を行うための規約プロパティを追加します。この規約プロパティは、 asakusafwOrganizer ブロック内の参照名 mapreduce でアクセスできます [5] 。
この規約オブジェクトは以下のプロパティを持ちます。
mapreduce.enabledデプロイメントアーカイブにMapReduce向けのバッチアプリケーションを実行するためのコンポーネントを追加するかどうかを指定する (各プロファイルのデフォルト値)。
trueを指定した場合にはコンポーネントを追加し、falseを指定した場合には追加しない。既定値:
true(コンポーネントを追加する)<profile>.mapreduce.enabled対象のプロファイルに対し、デプロイメントアーカイブにMapReduce向けのバッチアプリケーションを実行するためのコンポーネントを追加するかどうかを指定する。
前述の
mapreduce.enabledと同様だが、こちらはプロファイルごとに指定できる。既定値:
asakusafwOrganizer.mapreduce.enabled(全体のデフォルト値を利用する)
| [5] | これらのプロパティは規約オブジェクト com.asakusafw.mapreduce.gradle.plugins.AsakusafwOrganizerMapReduceExtension が提供します。 |
コマンドラインオプション¶
mapreduceCompileBatchapps タスクを指定して gradlew コマンドを実行する際に、 mapreduceCompileBatchapps --update <バッチクラス名> と指定することで、指定したバッチクラス名のみをバッチコンパイルすることができます。
また、バッチクラス名の文字列には * をワイルドカードとして使用することもできます。
以下の例では、パッケージ名に com.example.target.batch を含むバッチクラスのみをバッチコンパイルしてデプロイメントアーカイブを作成しています。
./gradlew mapreduceCompileBatchapps --update com.example.target.batch.* assemble
そのほか、 mapreduceCompileBatchapps タスクは gradlew コマンド実行時に以下のコマンドライン引数を指定することができます。
-
--options<k1=v1[,k2=v2[,...]]>¶ 追加のコンパイラプロパティを指定する。
規約プロパティ
asakusafw.mapreduce.optionで設定したものと同じキーを指定した場合、それらを上書きする。
-
--fail-on-error<"true"|"false">¶ コンパイルエラー発生時に即座にコンパイル処理を停止するかどうか。
規約プロパティ
asakusafw.mapreduce.failOnErrorの設定を上書きする。
-
--update<batch-class-name-pattern>¶ 指定のバッチクラスだけをコンパイルする (指定したもの以外はそのまま残る)。
規約プロパティ
asakusafw.mapreduce.{in,ex}cludeと同様にワイルドカードを利用可能。このオプションが設定された場合、規約プロパティ
asakusafw.mapreduce.{in,ex}cludeの設定は無視する。
Asakusa DSL Compiler for MapReduce リファレンス¶
コンパイラプロパティ¶
Asakusa DSL Compiler for MapReduceで利用可能なコンパイラプロパティについて説明します。これらの設定方法については、 Batch Application Plugin ( asakusafw ) への拡張 の mapreduce.option の項を参照してください。
| 項目名 | 既定値 | 概要 |
|---|---|---|
enableCombiner |
無効 | 部分集約 [6] の既定値。 部分集約を許す演算子に対して |
compressFlowPart |
有効 | ステージ数が少なくなる方法でフロー演算子を展開する。 このオプションが無効であればフロー演算子の展開時に全ての入出力にチェックポイント演算子を挿入する。 このオプションが有効であれば、展開時に何も挿入しない。 |
compressConcurrentStage |
有効 | 互いに影響のないステージを1つのステージに合成する。 このオプションが有効であれば、互いに依存関係のない2つ以上のステージを単一のステージに合成し、無効であれば合成しない。 |
hashJoinForTiny |
有効 | データサイズに このオプションが有効であれば上記の動作を行い、無効であればコンパイラが自動的に結合戦略を決定する。 |
hashJoinForSmall |
無効 | 将来の拡張のためにリザーブされた項目。現在は動作に影響しない。 |
enableDebugLogging |
無効 |
このオプションが有効であれば、そのようなロギング演算子をコンパイル後も保持する。 無効であれば、コンパイル時にそれらの演算子を除去する。 |
上記の他に、 X から始まるいくつかの コンパイラスイッチ も存在します。
コンパイラスイッチもコンパイルオプションと同じシステムプロパティを利用します。
Note
compressFlowPart の既定値は0.2から「有効」に変更しました。
チェックポイント演算子はMapReduceの単位 (ステージ) に区切りをいれる演算子で、元は「フロー部品のテスト時とできるだけ同じ構造にしたほうが良い」という前提でこのオプションを無効化していました。
しかし、あまりにMapReduceの回数が増えてしまい、処理効率が著しく低下するため、0.2よりこの規定値が見直されることになりました。
Note
compressConcurrentStage は利点と欠点のある最適化です。
この最適化により、ステージ数は最小で「クリティカルパスのステージ数」まで低下します。
しかし、ここで合成されるステージは本来互いに影響がありませんので、Hadoopはこれらのステージを同時に処理することが可能です。
この最適化の欠点は、時間のかかるステージとかからないステージを合成してしまうと、後者のステージが本来先に終わる場合でも、前者のステージの処理が完了するまで余計な待ち合わせが発生してしまう点です。 Hadoopクラスターが十分に大きく、ワークフローエンジンが並列のジョブ投入をサポートしている場合は、このオプションは見直すべきでしょう。
Note
hashJoinForTiny は、Hadoopの DistributedCache の仕組みを利用しています。
ハッシュ表での結合を行う場合、入力データをHadoopクラスターの全てのノードに配布します。
そこでハッシュ表を構築し、タスクのメモリ上に保持します。
現在の標準的な結合戦略はShuffle+Sortを利用したマージ結合であるため、これは結合操作を行うたびにReduceフェーズが必要になってしまいます。 結果としてMapReduceのステージ数が増大してしまいますが、ハッシュ表を利用する場合には全てのノードのメモリ上に表を構築しているため、Reduce処理が不要になり、ステージ数を削減できるという利点があります。
ただし、およそハッシュ表の元になったデータサイズの倍程度のメモリを必要とするため、適用範囲が限られてしまうという問題はあります。
| [6] | 部分集約の設定については、 演算子リファレンス の単純集計演算子や畳み込み演算子を参照してください。 |
| [7] | com.asakusafw.vocabulary.flow.processor.PartialAggregation |
コンパイラスイッチ¶
コンパイラスイッチはコンパイラの内部的な挙動を操作するためのオプションで、 コンパイラプロパティ と同様の方法で設定します。
Hint
通常の場合、コンパイラスイッチを指定する必要はありません。 コンパイル時にコンパイラから推奨される場合がありますので、その際に利用を検討してください。
すべてのコンパイラスイッチは X<項目名>=<値> の形式で設定します。
以下は変更可能なコンパイラスイッチの一覧です。
| 項目名 | 既定値 | 概要 |
|---|---|---|
MAPREDUCE-370 |
DISABLED |
利用中のHadoopにパッチ MAPREDUCE-370 が適用済みかどうか。
ENABLED の場合は適用済みと仮定し、 DISABLED の場合は未適用と仮定する。 |
compressFlowBlockGroup |
ENABLED |
コンパイラプロパティ の compressConcurrentStage を適用した際、ステージ内のMapperとReducerを併合するかどうか。
ENABLED の場合は併合し、 DISABLED の場合は併合しない。 |
packaging |
ENABLED |
アプリケーションのパッケージングを行うかどうか。 |
javaVersion |
1.8 [8] |
DSLコンパイラがコンパイル時に指定するJavaのバージョン |
Tip
コンパイルオプションは項目名を間違えた場合にエラーとなりますが、コンパイラスイッチは項目名を間違えると単に設定が無視されます。
| [8] | Asakusa Gradle Plugin ユーザーガイド に従ってアプリケーションプロジェクトを作成した場合は、Gradle Pluginの設定値が適用されます。詳しくは Asakusa Gradle Plugin リファレンス を参照してください。 |