[Spark道場]メモリとCPU数の設定を最適化する

皆さん

こんにちは、GMOアドマーケティングのS.Rです。
大規模分散処理フレームワークであるSparkですが、皆さんはSparkの設定を最適化したことはありますか?
Sparkは設定次第でPerformanceが10倍以上改良する可能性があります。
今回はSparkの重要な設定の一部である、executorメモリ、Core数の設定の最適化例を紹介します。

1. Yarnのモード

Sparkが主に使っているResource ManagerはYarnなので、今回はYarnで管理する場合の設定を紹介します。
YarnはClient(図1)や  Cluster(図2)の2つのモードがあります。
ClusterモードはSparkのApplication ManagerはMaster Nodeで動作し、ClientモードではApplication ManagerはWorker Nodeで動作します。

図1. Clientモード

図2. Clusterモード

2. Spark NodeのCPU設定

図3:DriverやExecutorのCPU設定

DriverやExecutorのCPU設定には2つの項目があります。

  1. spark.executor.core:1つのExecutorのCPU数です。この項目は一般的に「5」を設定することが推奨されています。
  2. spark.driver.core:1つのDriverのCPU数です。こちらも「5」を設定することをおすすめします。

3. Spark Nodeのメモリ設定

SparkでDriverやExecutorのメモリレイアウトを図3で説明します。

図4. DriverやExecutorのメモリレイアウト

  • Executor:
    Executorの設定は3つの項目があります。

    1. spark.executor.memory:JVMが使用するメモリのうち、1つのExecutorが使用する最大のメモリの割合です。
    2. spark.memory.fraction:Sparkのプログラムが使うメモリの割合です。spark.memory.fractionが低くなればJVMのゴミを回収する時間が長くなります。一般的に、この項目はデフォルト値(0.6)を設定します。
    3. spark.storage.fraction:JVMが使えるメモリのうち、RDDを格納した部分です。spark.storage.fractionは高くなればJVMのゴミを回収する時間が長くなります。一般的に、この項目はデフォルト値(0.5)を設定します。
  • Driver:
    Driverには1つの設定項目があります。

    1. spark.driver.memory:JVMが使用するメモリのうち、1つのDriverが使用する最大のメモリの割合です。

実際に運用する時に一番重要な項目はspark.executor.memoryです。
この項目を設定する際に考えるべきことが2つあります。
1つはOSが動作するのに必要なメモリを確保することです。一般的に1GBを設定することが多いです。
もう1つは作成したプログラムが動作するのに必要なメモリ(一般的には1つexecutorが利用するメモリの1割)を確保することです。

4. メモリ・CPUの設定例

例として、SparkのInstanceのMaster Nodeのメモリーが10GBで、CPU数を8とし、WorkerのNodeのメモリは40GBで、CPU数を16とします。
まずは、spark.executor.coreとspark.driver.coreを5に設定します。
1つのWorkerでOSが動作するために、CPU数を1、メモリを1GBを取っておくので、executorに利用できるCPU数は15で、メモリが39GBとなります。
そのため、1つのWorkerでexecutorが3(15 / 5)つあることになります。
1つexecutorに利用できるメモリは13GB(39 / 3)です。この13GBの1割を確保したいので、spark.executor.memoryを12GBに設定します。spark.driver.memoryはYarnのモードよって2つの設定があります。
YarnのモードがClientであればspark.driver.memoryに12GBまで設定できますが、YarnのモードがClusterであればMaster Nodeには10GBのメモリしかないので、spark.driver.memoryには9GBまで設定することができます。

表1. メモリ・CPUの設定例

モード Cluster Client
spark.driver.memory 12 12
spark.driver.core 5 5
spark.driver.memory 9 13
spark.executor.memory 13  13

 

5. まとめ

今回はSparkのメモリ、CPU数の設定の基本知識を紹介しました。
SparkのProgramをチューニングする時に、適切なメモリやCPU数を設定することでパフォーマンスを大幅に改良することができるので、機会があればぜひ試してみてください。