皆さん
こんにちは、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つの項目があります。
- spark.executor.core:1つのExecutorのCPU数です。この項目は一般的に「5」を設定することが推奨されています。
- spark.driver.core:1つのDriverのCPU数です。こちらも「5」を設定することをおすすめします。
3. Spark Nodeのメモリ設定
SparkでDriverやExecutorのメモリレイアウトを図3で説明します。
図4. DriverやExecutorのメモリレイアウト
- Executor:
Executorの設定は3つの項目があります。
- spark.executor.memory:JVMが使用するメモリのうち、1つのExecutorが使用する最大のメモリの割合です。
- spark.memory.fraction:Sparkのプログラムが使うメモリの割合です。spark.memory.fractionが低くなればJVMのゴミを回収する時間が長くなります。一般的に、この項目はデフォルト値(0.6)を設定します。
- spark.storage.fraction:JVMが使えるメモリのうち、RDDを格納した部分です。spark.storage.fractionは高くなればJVMのゴミを回収する時間が長くなります。一般的に、この項目はデフォルト値(0.5)を設定します。
- Driver:
Driverには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数を設定することでパフォーマンスを大幅に改良することができるので、機会があればぜひ試してみてください。