ハードウェアプロビジョニング
Spark開発者に頻繁に寄せられる質問は、Sparkのためにハードウェアをどのように設定するかということです。適切なハードウェアは状況によって異なりますが、以下の推奨事項を提示します。
ストレージシステム
ほとんどのSparkジョブは、外部ストレージシステム(例:Hadoop File System、HBase)から入力データを読み取る必要があるため、**このシステムのできるだけ近くに配置する**ことが重要です。以下の推奨事項をお勧めします。
-
可能であれば、SparkをHDFSと同じノードで実行してください。最も簡単な方法は、同じノードにSparkのスタンドアロンモードクラスターを設定し、SparkとHadoopのメモリおよびCPU使用量を干渉しないように設定することです(Hadoopの場合、関連するオプションはタスクあたりのメモリ用の
mapred.child.java.opts、タスク数用のmapreduce.tasktracker.map.tasks.maximumおよびmapreduce.tasktracker.reduce.tasks.maximumです)。あるいは、Hadoop YARNのような共通のクラスターマネージャーでHadoopとSparkを実行することもできます。 -
これが不可能な場合は、SparkをHDFSと同じローカルエリアネットワーク内の別のノードで実行してください。
-
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バウンドまたはネットワークバウンドになります。