ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

Asakusa on M3BPの入出力バッファーのアクセス方式

2016-12-22 00:00:00 | PG(分散処理)

Asakusa Framework Advent Calendar 2016の22日目です。

Javaでは、意外と2GBの壁があります。例えばbyte配列は2GBより多いサイズを扱えません。これは、配列の添え字がintなので、Integer.MAX_VALUEより大きな値を指定できない為です。
普通のJavaアプリケーションならそんな大きなサイズのデータは扱わないかもしれませんが、ビッグデータを扱う分散処理フレームワークでは結構有名な問題のようです。(例えばSparkにそんなIssueがある

で、Asakusa on M3BPも同様の問題があります。
デフォルトでは、各演算子の出力やファイル出力で1ファイル当たり2GBを超えると、エラーが発生します。
ファイル出力の場合は、Direct I/OのExporterでファイル分割するように指定してあれば、分割された個々のファイルがそれぞれ2GBを超えなければ大丈夫です。(「*」で自動分割する場合は問題なし)

どうしても2GBを超えたい場合は、ASAKUSA_HOME/m3bp/conf/m3bp.propertiesでcom.asakusafw.m3bp.buffer.access(デフォルトはnio)にunsafeを指定すると、2GBを超えるデータを出力できます。
(unsafeというのは、sun.misc.Unsafeを使っている?これだとすると、これはsunパッケージなので非推奨であり、Java9辺りで無くなるという話もある)