メインコンテンツへジャンプ

Sparkチューニング

Databricks 無料トライアル

Sparkパフォーマンスチューニングとは

Sparkパフォーマンスチューニングとは、システムが使用するメモリやコア、インスタンスなどを記録するための設定を調整する処理のことです。この処理により、Sparkは優れた性能を発揮し、リソースのボトルネックの防止も可能になります。Sparkパフォーマンスチューニング

データのシリアライズとは

メモリ使用量を削減するために、Spark RDDをシリアル化して格納する必要があります。また、データのシリアライズは、ネットワークのパフォーマンスにも影響します。Sparkの性能を向上させるには、次のような処理が挙げられます。

  • 長時間実行されているジョブを終了
  • 適切な実行エンジンでジョブを実行
  • 全てのリソースを効率的に使用
  • システムがパフォーマンスに要する時間を改善

Sparkは、次の2つのシリアライズライブラリをサポートしています。

  • Javaのシリアライズ
  • Kryoのシリアライズ

メモリチューニングとは

メモリ使用量の調整には、次の3つの留意点があります。

  • データセットは全てメモリに収める必要があるため、オブジェクトによって使用されるメモリ量の考慮が不可欠になること
  • オブジェクトの回転率の上昇により、ガベージコレクションのオーバーヘッドが必要になること
  • オブジェクトにアクセスするコスト

データ構造のチューニングとは

メモリの消費量を削減するためには、オーバーヘッドになりうるJava機能を避けるという選択肢があります。具体的な方法は次のとおりです。

  • RAMサイズが32GB未満の場合、JVMフラグを–xx:+ UseCompressedOopsに設定し、ポインタを8バイトから4バイトにする
  • 複数の小さなオブジェクトとポインタを使用し、入れ子構造を避ける
  • キーに文字列を使用する代わりに、数値IDまたは列挙型オブジェクトを使用する

ガベージコレクションのチューニングとは

プログラムが以前確保した不要なRDDがメモリ領域を占有するのを避けるため、Javaは古いオブジェクトを削除し、新しいオブジェクトにスペースを割り当てます。一方、オブジェクトの少ないデータ構造を使用することで、コストは大きく削減されます。例として、LinkedListの代わりにIntの配列を使用することが挙げられます。または、シリアル化されたオブジェクトを使用することで、オブジェクトはRDDパーティションごとに1つのみとなります。

メモリ管理とは

優れた性能を発揮するには、メモリの効果的な使用が必要不可欠です。Sparkでは、主に保存と実行のためにメモリを使用します。保存メモリは、後に再利用するデータをキャッシュするために使用されます。一方、実行メモリは、シャッフル、ソート、結合、集約などの計算に使用されます。Apache Sparkが解決しなくてなならないメモリの競合の課題は次の3つです。

  • 実行メモリと保存メモリのアービトレート
  • 同時に実行しているタスクのメモリのアービトレート
  • 同一タスク内で実行しているオペレータのメモリのアービトレート

事前にメモリの静的確保を避けるのではなく、メモリからデータを強制的に解放し、発生したメモリの競合に対応することが可能です。

関連資料

用語集に戻る