Asakusa on M3BPの各種設定のメモ。
|
|
ビルド(デプロイメントアーカイブの生成)時に使用する設定はbuild.gradleに記述する。
設定できる項目はAsakusa on M3BPリファレンスのGradle
Plugin リファレンスを参照。
例えば『Framework Organizer Plugin ( asakusafwOrganizer ) への拡張』のm3bp.useSystemHadoopの場合、asakusafwOrganizerブロックに記述する。
(m3bp.useSystemHadoopはAsakusaFW 0.10.0で廃止になったが^^;[2017-12-14])
〜 asakusafwOrganizer { m3bp.useSystemHadoop true } 〜
もしくは
〜 asakusafwOrganizer { m3bp { useSystemHadoop true } } 〜
ドキュメント上にprofileと書かれているもの(例えば<profile>.m3bp.useSystemHadoop
)は、プロファイル毎に個別の設定が出来る。
プロファイルは、デプロイ対象の環境(本番環境とかステージング環境とか)毎に設定を変えたい場合に使用する。
例えばstage(プロファイル名は自由に付けることが出来るが、prodは本番環境、devは単体テスト環境と決まっている)の場合、以下のように記述する。
〜 asakusafwOrganizer { profiles.stage { m3bp.useSystemHadoop true } } 〜
ちなみに、その環境向けのデプロイメントアーカイブだけを生成するには、コマンドの後ろに「_プロファイル名」を付ける。
$ ./gradlew assembleAsakusafw_stage
Asakusa on M3BPリファレンスにあるコンパイラプロパティは、gradlewのm3bpCompileBatchappsの--optionsやbuild.gradleのm3bp.optionで指定する。[2017-06-10]
build.gradleに記述する場合は、具体例としては以下のように書く。
〜 asakusafw { m3bp { option 'operator.estimator.Extract', 2.0 option 'operator.estimator.CoGroup', 2.0 } } 〜
また、個別のバッチ毎にコンパイラープロパティーを指定したい場合は以下のようにバッチID(@Batchで指定された名前)を記述する。
AsakusaFW 0.9.1のドキュメントには「バッチID.オプション名
」とあるが、ピリオドでなく「バッチID:
」とするのが正しい。
〜 asakusafw { m3bp { option 'HogeBatch:operator.estimator.Extract', 2.0 option 'HogeBatch:operator.estimator.CoGroup', 2.0 } } 〜
なお、ビルドログの中に、どのようなコンパイラープロパティー(オプション)が指定されたかが出力される。
〜 compiler.option.operator.estimator.CoGroup = 2.0 compiler.option.operator.estimator.Extract = 2.0 〜
デフォルトでは、デプロイメントアーカイブを作成すると、Hadoopライブラリーは実行環境にあるものを使う状態になる。[2021-05-13]
実行環境にHadoopが無い(あるいは実行環境のHadoopを使用しない)場合は、ビルド時に最低限のHadoopライブラリーを組み込むことが出来る。
〜 asakusafwOrganizer { hadoop.embed true } 〜
ただし、最低限のHadoopライブラリーなので、「s3:
」スキーマは使用できない模様。
M3BP実行環境のデフォルトの設定はm3bp.propertiesに記述する。
設定項目はAsakusa on M3BPの最適化設定を参照。
## the max number of worker threads # com.asakusafw.m3bp.thread.max= ## the thread affinity mode (none|compact|scatter) # com.asakusafw.m3bp.thread.affinity= ## the default number of partitions # com.asakusafw.m3bp.partitions= ## output buffer size (in bytes) # com.asakusafw.m3bp.output.buffer.size= ## the max number of records in each output buffer # com.asakusafw.m3bp.output.buffer.records= ## extra hadoop configurations hadoop.io.file.buffer.size=131072
※m3bp.propertiesに記述すると全バッチに適用されるので、バッチ個別に指定したい場合はASAKUSA_M3BP_ARGSを使用する。[2016-06-22]
Asakusa on M3BPでは、データモデルのオブジェクトをシリアライズして出力バッファーに出力する。
シリアライズしたサイズが出力バッファー(の残りサイズ・空き容量)より大きいと、アプリケーションが異常終了する。
出力バッファーのサイズは以下の様に指定する。
(Asakusa on M3BP 0.1.1では、バッファーサイズを指定しても反映されないというバグがあり、0.1.2で修正されている。[/2016-07-31])
## output buffer size (in bytes) com.asakusafw.m3bp.output.buffer.size=4194304 com.asakusafw.m3bp.output.buffer.flush=0.8
デフォルトは4MB、フラッシュの閾値は0.8である。
データモデルをシリアライズして出力バッファーに追加してゆき、閾値を超えたらフラッシュする仕組みになっているらしい。
デフォルトでは、4MBの0.8倍(=3.2MB)を超えたらフラッシュする。
例えば、バッファーにデータを追加していって3.1MBに達した後、1MBのデータが来たら、合計でバッファーサイズを超えてしまう為、異常終了してしまう。
つまり、データモデルのオブジェクト(のシリアライズ後のサイズ)が「出力バッファーサイズ×(1 -
閾値)」に収まるよう、出力バッファーサイズと閾値を設定する必要がある。
(デフォルトであれば、4MB×0.2=0.8MBを超えるデータがある場合は、出力バッファーが溢れて異常終了する可能性がある)
ただし、出力バッファーサイズにあまり大きな値を指定するとパフォーマンスが劣化する可能性もあるので、注意が必要。[2016-06-22]
(各vertexの出力ポート毎に出力バッファーを作るので、アプリケーションの内容によっては出力バッファーが大量に作られるらしい)
Asakusa on M3BPの入出力バッファーのアクセス方式として、JavaのNIO(New I/O)を使う方式と、unsafeな方式がある。
デフォルトはnioになっているが、AsakusaFW 0.9.0以前は、nioではひとつの出力が2GBを超えられないという制限がある。(Javaの配列の添字がintだかららしい?)
(例えば複数ファイルに分割して出力する場合、1ファイル当たり2GB以下なら問題ない)
unsafeにするとこの制限が無くなる。
ただし、unsafeだとメモリー境界(バッファーオーバーラン)のチェックが行われない為、想定外のサイズのデータが来るとSEGVが発生してJavaVM自体がクラッシュすることがある。
com.asakusafw.m3bp.buffer.access=unsafe
AsakusaFW 0.9.1では、nioでも2GBの制限が無くなったので、基本はnioでよい。[2017-04-30]
Asakusa on M3BPの実行環境の環境変数について。
Asakusa on M3BPのJavaVMのオプションは、ASAKUSA_M3BP_OPTSで指定できる。
$ export ASAKUSA_M3BP_OPTS='-Xmx16g'
-XmxでJavaVMが使用する最大ヒープサイズを指定することが出来るが、できるだけ大きな値を指定すればよいというものではない。
Asakusa on M3BPでは、AsakusaFW(Java)とM3BPコア(C++)がメモリーを使用する。
JavaVMの指定はAsakusaFWが使用する分なので、このサイズが大きすぎると、M3BPコアが使用できるメモリーが減ってしまう^^;
AsakusaFW(JavaVM)もメモリーを使うので多少は大きな値を設定する必要があるが、なるべくM3BPコアにメモリーをまわすような設定にした方が良いと思う。
M3BPのパラメーター(例えばm3bp.propertiesに記述する内容)をASAKUSA_M3BP_ARGSで指定できる。[2016-06-22]
m3bp.propertiesに記述する内容の場合、--engine-confオプションを使用する。
$ export ASAKUSA_M3BP_ARGS="--engine-conf com.asakusafw.m3bp.output.buffer.size=4194304 --engine-conf com.asakusafw.m3bp.output.buffer.flush=0.8"
m3bp.propertiesに記載されている内容よりも環境変数で指定した内容の方が優先されるので、バッチ個別に値を指定したい場合はASAKUSA_M3BP_ARGSを使用する。
M3BPアプリケーションを起動するjavaコマンドの前に入れるコマンドを指定できる。[2016-12-23]
例えば以下のようにtimeコマンドを仕掛けると、実行にかかった時間と最大メモリー使用量等が確認できる。(ただし、yaess-batch.shにtimeコマンドを仕掛ける方法でも結果は大して違わなかった)
$ export ASAKUSA_M3BP_LAUNCHER="/usr/bin/time -v" $ $ASAKUSA_HOME/yaess/bin/yaess-batch.sh m3bp.ExampleBatch
Hadoopの設定において、ユーザーの設定をクラスパスの先頭に持ってくる。
logback.xmlを変更した場合は、念のため、この環境変数をtrueにしておくのが良いらしい。
M3BP実行環境のASAKUSA_HOME/m3bp/conf/logback.xml
で、ログの出力レベルを設定できる。
デフォルトはINFOだが、DEBUGにするとデバッグ情報が出る。
TRACEにすると処理中のデータも出力される。(当然大量になりうるので注意)
なお、 もしかするとHadoopのログの設定の方が優先されてしまうかもしれないので、M3BPの設定を優先させる必要がある。
$ export HADOOP_USER_CLASSPATH_FIRST="true"