ハードウェアプロビジョニング

Spark開発者に頻繁に寄せられる質問は、Sparkのためにハードウェアをどのように設定するかということです。適切なハードウェアは状況によって異なりますが、以下の推奨事項を提示します。

ストレージシステム

ほとんどのSparkジョブは、外部ストレージシステム(例:Hadoop File System、HBase)から入力データを読み取る必要があるため、**このシステムのできるだけ近くに配置する**ことが重要です。以下の推奨事項をお勧めします。

ローカルディスク

Sparkは多くの計算をメモリ内で行えますが、RAMに収まらないデータを保存するため、またステージ間で中間出力を保持するために、ローカルディスクを使用します。ノードあたり**4〜8個のディスク**を用意し、RAIDなし(単なる個別のマウントポイント)で設定することをお勧めします。Linuxでは、不要な書き込みを減らすためにnoatimeオプションでディスクをマウントしてください。Sparkでは、spark.local.dir変数をローカルディスクのカンマ区切りリストに設定してください。HDFSを実行している場合、HDFSと同じディスクを使用しても問題ありません。

メモリ

一般的に、Sparkはマシンあたり**8 GiBから数百 GiB**のメモリで良好に実行できます。いずれの場合も、Sparkにはメモリの最大75%を割り当てることをお勧めします。残りはオペレーティングシステムとバッファキャッシュ用に残しておきます。

必要なメモリ量は、アプリケーションによって異なります。特定のデータセットサイズでアプリケーションがどれだけのメモリを使用するかを判断するには、Spark RDDにデータセットの一部をロードし、Sparkの監視UI(http://<driver-node>:4040)の[Storage]タブを使用して、メモリ内のサイズを確認してください。メモリ使用量は、ストレージレベルとシリアライゼーション形式に大きく影響されることに注意してください。メモリ使用量を減らすためのヒントについては、チューニングガイドを参照してください。

最後に、Java VMは200 GiBを超えるRAMでは常にうまく動作するとは限らないことに注意してください。この量を超えるRAMを搭載したマシンを購入した場合は、1つのノードで複数のエグゼキュータを起動できます。Sparkのスタンドアロンモードでは、ワーカーは利用可能なメモリとコアに応じて複数のエグゼキュータを起動する責任があり、各エグゼキュータは個別のJava VMで起動されます。

ネットワーク

私たちの経験では、データがメモリ内にある場合、多くのSparkアプリケーションはネットワークバウンドです。**10 Gigabit**以上のネットワークを使用することが、これらのアプリケーションを高速化する最良の方法です。これは、グループ化、削減、SQL結合などの「分散削減」アプリケーションに特に当てはまります。いずれかのアプリケーションで、アプリケーションの監視UI(http://<driver-node>:4040)から、Sparkがネットワーク全体でどれだけのデータをシャッフルしているかを確認できます。

CPUコア

Sparkは、スレッド間の共有を最小限に抑えるため、マシンあたり数十個のCPUコアまでうまくスケールします。マシンあたり少なくとも**8〜16コア**をプロビジョニングする必要があるでしょう。ワークロードのCPUコストによっては、さらに多くのコアが必要になる場合もあります。データがメモリ内に入ると、ほとんどのアプリケーションはCPUバウンドまたはネットワークバウンドになります。