ハードウェアの準備
Spark開発者によって受け取られる一般的な質問は、そのためにハードウェアをどう設定するかということです。正しいハードウェアは状況に依存しますが、以下のお勧めがあります。
ストレージシステム
ほとんどのSparkジョブは入力データをおそらく外部ストレージ(例えば、HadoopファイルシステムあるいはHBase)から読み込む必要があるので、それをできるだけこのシステムに近くにおくことが重要です。以下をお勧めします:
-
とにかく可能であれば、SparkをHDFSとして同じノード上で実行します。最も単純な方法はSparkを同じノード上のスタンドアローンモードクラスタ でセットアップし、SparkおよびHadoopのメモリとCPU利用率を干渉しないように設定します。(Hadoopの場合、関係するオプションはタスクあたりのメモリの
mapred.child.java.opts
と、タスクの数のmapreduce.tasktracker.map.tasks.maximum
およびmapreduce.tasktracker.reduce.tasks.maximum
です。)もう一つの方法として、HadoopおよびSparkをMesos あるいは Hadoop YARNのような一般的なクラスタマネージャ上で実行することができます。 -
これが無理であれば、SparkをHDFSとして同じローカルエリアネットワーク上の異なるノードで実行します。
-
HBaseのようなレンテンシが低いデータストアについては、干渉を避けるためにストレージシステムよりは異なるノード上で計算ジョブを実行することが望ましいかも知れません。
ローカルディスク
Sparkはメモリ内で大量の計算を実施することができますが、ステージ間の中間出力を保持するのと同様に、RAMに一致しないデータを格納するためにローカルディスクを使います。(異なるマウントポイントとともに)RAID無しで設定したノードあたり 4-8 ディスクを持つことをお勧めしますLinuxでは不要な書き込みを減らすために、ディスクを noatime
オプション付きでマウントします。Sparkでは、spark.local.dir
変数にローカルディスクのカンマ区切りのリストを設定します。HDFSを実行しているのであれば、HDFSとして同じディスクを使うと良いです。
メモリ
一般的に、Sparkはマシーン一台あたりメモリの8 GB から数1千GB のどこでもうまく動作することができます。全ての場合において、Sparkのために最大75%のメモリを割り当てることをお勧めします; 残りはオペレーティングシステムとバッファキャッシュのために残します。
どれだけのメモリが必要になるかはあなたのアプリケーションによります。あるデータセットのサイズのためにアプリケーションがどれだけ使用するかを決定するために、Spark RDDにデータセットの一部をロードし、メモリ内のそのサイズを見るためにSparkの監視UI(http://<driver-node>:4040
) のストレージタブを使用します。メモリの使用はストレージレベルとシリアライズフォーマットに大きく影響されることに注意してください - 減らし方のtipsについてはチューニングガイドを見てください。
最後に、Java VMはRAM200GB以上では常に良く動作するわけではないことに注意してください。これより多いRAMのマシーンを購入した場合は、ノードごとに複数のワーカーJVMを実行することができます。Sparkのスタンドアローンモードでは、conf/spark-env.sh
の SPARK_WORKER_INSTANCES
変数を使ってノードあたりのワーカーの数を、SPARK_WORKER_CORES
を使ってワーカーごとのコアの数を設定することができます。
ネットワーク
経験上は、データがメモリにあると、多くのSparkアプリケーションがネットワーク帯域を使用します。これらのアプリケーションを速くするには、10 Gigabit以上のネットワークを使うことが最善の方法です。これは特にgroup-by、reduce-by、およびSQL joinのような"distributed reduce"アプリケーションで当てはまります。任意のアプリケーションの中で、アプリケーションの監視UI(http://<driver-node>:4040
)からSparkがどれだけのデータをネットワークに渡ってシャッフルするかをみることができます。
CPU コア
Sparkはスレッド間で最小限の共有を行うため、マシーンあたり数十のCPUコアに良くスケールします。マシーンあたり少なくとも8-16 コアの配備をするべきです。作業のCPUコストに依存しますが、それ以上も必要とするかもしれません: 一旦データがメモリ内に入ると、ほとんどのアプリケーションはCPUあるいはネットワークの帯域の制限を持ちます。