ハードウェアの準備

Spark開発者によって受け取られる一般的な質問は、そのためにハードウェアをどう設定するかということです。正しいハードウェアは状況に依存しますが、以下のお勧めがあります。

ストレージシステム

ほとんどのSparkジョブは入力データをおそらく外部ストレージ(例えば、Hadoopファイルシステムあるいは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.shSPARK_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あるいはネットワークの帯域の制限を持ちます。

TOP
inserted by FC2 system