Asakusa Framework Advent Calendar 2016の16日目です。
Asakusa on SparkはApache Spark上で稼動します。
デフォルトの設定のままで動けば楽なのですが、扱うデータ量が多いとやはりそういうわけにもいきません^^;
GCが頻発して遅くなるとかOutOfMemoryErrorになるといった事が起きます。
こうした場合、Spark自体のチューニングも考えますが、AsakusaFW側としてもチューニング(Asakusa on Sparkの最適化設定に書かれているものを設定)することになります。
特にcom.asakusafw.spark.fragment.bufferSizeを真っ先に設定しています。
bufferSizeというプロパティー名ですが、単位はバイト数ではなく、オブジェクトの個数です。経験上、256にしておけばとりあえず大丈夫ですね。
このプロパティーを設定していない場合、演算子から出力されるデータモデルオブジェクトは全て(という言い方をすると語弊がありそうですが)メモリー上に保持されるらしいです。つまりメモリーに乗り切るならこれが一番速いわけですが、メモリーが足りなくなるとGCが頑張ってしまうというわけです。
このプロパティーを設定すると、メモリー上で保持するオブジェクト数がその設定数を超えたらファイルに退避するそうです。それでGCは発生しなくなりますが、ファイルに退避するので速度は低下するらしいです。とはいえ経験上、GCの頻発よりはこっちの方が断然ましですね。
(あと、退避するファイルはjava.io.tmpdirが指す場所、つまり/tmpに出力されるようです。大量に出力されるようなら、/tmpのディスク容量も重要になってきます)
あとはcom.asakusafw.spark.parallelismですかね。
SparkのExecutorに割り当てた全コア数の1~4倍程度を指定するとのことなので、クラスターの大きさによって設定すべき値は異なると思われます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます