Asakusa Frameworkの実行環境としてM3 for Batch Processingを使う機能。
|
AsakusaFW 0.8.0(2016/4/8)で、Asakusa Frameworkの実行環境としてM3 for Batch Processing(以下M3BP)を使う機能が加わった。
M3BPは、フィックスターズ社が開発した、単一ノード・マルチコア(マルチプロセッサー)で動作するデータ処理エンジン(OSS)。
Hadoopがコモディティーなサーバーを複数台使用してクラスターを組むのに対し、M3BPは高性能なサーバー1台(数十のCPU(コア)を持ち、メモリーも大量に積む(数十GB〜TB級))を対象とする。
要するにマルチスレッドの処理エンジンなのだが、これはJavaではなく、ネイティブな実行バイナリーで動くので、Javaより速い。
この機能は(Asakusa on Sparkと同様に)運用環境で実行するものであり、Asakusaアプリケーションの開発方法は従来のAsakusaFWと全く同じ。
(単体テストの実行にはM3BPを使用しない)
AsakusaDSLは従来のものと同じだが、ネイティブライブラリーを生成する為、コンパイルにはJavaだけでなくCMakeやg++が必要になる。(従来のHadoop版バッチやSpark版バッチと同時にコンパイルすることは出来る)
実行方法は、従来と同じくYAESSを使用する。(バッチ名にm3bpを付けるだけ)
M3BPが動作するサーバーは、数十のCPU(コア)を持ち、メモリーも大量に積んでいることを想定している。
つまりメモリーが数百GB以上あり、入出力データが数十GB程度というバッチ(自分が作っているバッチもほとんどはこのサイズ以下)なら、中間データまで含めてメモリーに乗り切るので処理できる。
もしデータがメモリーに収まらない場合は、(スピルアウト等はせず)落ちるらしい。
(M3BPで処理できないデータ量ならHadoopクラスター上のSparkで動かせばいい。AsakusaFWならアプリは同一でコンパイルのみで両方作れるので、切り替えは簡単(笑))
Asakusa on M3BPは(単一ノードで動くので)Hadoopは直接は関係ないが、従来のAsakusaFWと同じくDirect I/OでHDFS上のファイルにアクセスできるし、ローカルファイルにもアクセスできる。
M3BPはネイティブな実行バイナリーで動作するが、AsakusaDSLは従来通りJavaで記述する。
実行時の処理分担は以下のような感じになっているらしい。
つまりHadoopやSparkが行っているようなことをM3BPが行うのだろう。
M3BPは単一ノード・マルチスレッドに特化したHadoopやSparkというイメージ。
Javaもマルチスレッドを扱うことは出来るが、M3BPはCPUのコアを直接使うネイティブスレッドであり、Javaのスレッドはそういう意味では論理的なスレッドである。また、Javaのスレッドはメモリーバリアー(オブジェクトのスレッド間の同期?)があるが、M3BPはそれが起きないよう考慮されているので速いらしい。
また、バイト列の操作に関しても、Javaは範囲外へアクセスしないかどうかのチェックが入るので、ネイティブの方がやはり速いらしい。
あと、M3BPは単一ノードに特化しているので、複数サーバー間のデータ転送やハートビート確認のような処理が発生しない。
かつ、オンメモリーでの処理に特化しているので、入出力ファイル以外のファイルアクセスも発生しない。
M3BPはC++で書かれている。
アプリケーションもC++で書けば、AsakusaFW(Java)を使うよりも高速になるかもしれない。
が、サンプルのWordCountを見る限り、自分でM3BP用アプリを直接コーディングする気にはなれない^^;