2018年9月6日0件のコメント皆さんこんにちは、GMOアドマーケティングのS.Rです。大規模分散処理フレームワークであるSparkですが、皆さんはSparkの設定を最適化したことはありますか?Sparkは設定次第でPerformanceが10倍以上改良する可能性があります。今回はSparkの重要な設定の一部である、executorメモリ、Core数の設定の最適化例を紹介します。ManagerはYarnなので、今回はYarnで管理する場合の設定を紹介します。Cluster(図2)の2つのモードがあります。Nodeで動作します。図3:DriverやExecutorのCPU設定DriverやExecutorのCPU設定には2つの項目があります。spark.executor.core:1つのExecutorのCPU数です。この項目は一般的に「5」を設定することが推奨されています。spark.driver.core:1つのDriverのCPU数です。こちらも「5」を設定することをおすすめします。Nodeのメモリ設定SparkでDriverやExecutorのメモリレイアウトを図3で説明します。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割)を確保することです。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となります。5)つあることになります。この13GBの1割を確保したいので、spark.executor.memoryを12GBに設定します。spark.driver.memoryはYarnのモードよって2つの設定があります。Nodeには10GBのメモリしかないので、spark.driver.memoryには9GBまで設定することができます。まとめ今回はSparkのメモリ、CPU数の設定の基本知識を紹介しました。SparkのProgramをチューニングする時に、適切なメモリやCPU数を設定することでパフォーマンスを大幅に改良することができるので、機会があればぜひ試してみてください。@gmoap_engineer本ブログで発信される情報は、各エンジニア個人の見解であり、弊社の公式見解ではありません。本ブログに掲載、引用等をしている商品またはサービス等の名称は、各社の商標または登録商標です。その他の事項について一切責任を負いかねます。発表する情報には注意を払っておりますが、公式発表、見解については、弊社WEBサイトおよびプレスリリースなどをご確認ください。GMOインターネットグループにおけるソーシャルメディア運用ポリシーについては次のページをご確認ください。本ブログに掲載のあるソフトウェアのダウンロードは自己責任で御願い致します。ソフトウェアのダウンロードの結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。本ブログに掲載のあるソフトウェアを扱う際は、各ソフトウェアの公式リファレンスを参照のもとご使用下さい。ソフトウェアの実行の結果、ご利用者に何らかの損失・損害が生じたといえども、当社ではその責任を負いかねます。