2017-07-26 17 views
0

累積の代わりに1つずつ操作のセットを実行するパフォーマンスのコストを知りたいと思います。ここで は、これら2つのシナリオを表現するためにいくつかのコードです:spark RDDで複数の操作を実行するパフォーマンス

シナリオ1:

val operations: List[Row => Boolean] 
val rdd: RDD[Row] 
val result: RDD[Boolean] = rdd.flatMap(row => operations.map(f => f(row))) 

シナリオ2

val operations: List[Row => Boolean] 
val rdd: RDD[Row] 
val result: RDD[Boolean] = sc.union(operations.map(f => rdd.map(f))) 

私は2番目の1が、より高価であることを知っているが、私は持っていますそれを好むいくつかの理由と私はそれがどれくらい高価であるか知りたいと思います。

私の操作数量は10〜100の間であり、RDDサイズはミリオン以上です。

+0

シナリオ1の見方では、行く方法があるようです –

答えて

0

私は、代表的なデータとベンチマーク結果の両方を実行することをお勧めします。それだけで、実際の人生の成果を正確に反映した答えを得ることができます。

最初のものは一度だけロードされるデータの恩恵を受けるかもしれないが、そこに遊びの他の多くの要因が、のような:系統の

  • 長さ(シャッフル、データキャッシュされています)。
  • ソースから系統が再実行された場合の入力形式。
  • 各操作およびGC構成に割り当てられるメモリ量。
  • 操作上の単一パスから得られたデータの総量。
  • クラスタ構成。
  • ダウンストリーム変換。

最初のシナリオでは、GCの一時停止やGC関連のOOMが長くなり、ディスクへのスピルが増えたり、リソース使用率が低下する可能性があります。第2のアプローチは、特にダイナミックアロケーションでより高い粒度を可能にする。

関連する問題