sparkパラメータ最適化チューニング

ARISE Tech Blog

こんにちは。Customer Analytics Division所属データサイエンティスト兼データエンジニアの渡邉です。ARISE analyticsでは数百人のデータサイエンティストが活躍しています。一般的な分析環境は、データサイエンティストがそれぞれEMRを立て、その上のsparkで分析を走らせています。ただ、その分日々の分析費用も大きいものとなっています。そこで、sparkパラメータ最適化にトライしました。

spark最適パラメータ計算法

こちらのAWSの記事に従って計算しました。一部のパラメータについて、絵で説明したいと思います。

spark.executor.cores

sparkはExecutorという単位があり、これが処理を実行する単位です。spark.executor.coresは各ExecutorがCPUのcoreをいくつ使用するか決めるパラメータです。絵で直感的にわかる通り、余っているcoreがもったいないので、できるだけ全部使うようにします。AWSプラクティスでは、最適値は5とされています。

spark.executors.cores = 5

spark.executor.memoryとspark.executor.memoryOverhead

少し複雑ですので3stepに分けて説明します。

➀インスタンスごとのExecutorの数

先ほど説明した通り、Executorに割り当てるcoreの数を決めると、インスタンス(EMRを構成する一つのマシン)ごとのExecutorの数が決まります。注意点としては、インスタンスのcoreのうちの1つはHadoop daemonsが使うので、Executorに割り当てることができません。

Number of Executors per instance = (total number of virtual cores per instance - 1)/ spark.executors.cores

➁Executorごとの割り当てmemory

Executorごとに割り当てられるメモリは、インスタンスのメモリをExecutorの数で割ったものです。ただし、注意点が2つあり、

  1. インスタンスのメモリとはyarn.nodemanager.resource.memory-mbに設定された数値です。(こちらにインスタンスタイプの一覧があります)
  2. 1GBはHadoop daemonsのために残しておいてください。

つまり計算式は次のようになります。

Total Executor memory = (yarn.nodemanager.resource.memory-mb - 1) / number of Executors per instance

➂spark.executor.memoryとspark.executor.memoryOverheadの配分

ここはAWSベストプラクティスにしたがって、spark.executor.memoryに9割、spark.executor.memoryOverheadに1割を割り当ててください。

spark.executors.memory = total Executor memory * 0.90

spark.yarn.executor.memoryOverhead = total Executor memory * 0.10

計算例

r4.4xlargeのクラスタを起動することを考えてみます。

r4.4xlargeは16コア、yarn.nodemanager.resource.memory-mb=116GBです。

➀インスタンスごとのExecutorの数

Number of Executors per instance = (16 - 1)/ 5

                                 = 3

➁Executorごとの割り当てmemory

Total Executor memory = 116 - 1 / 3

                      = 38GB

➂spark.executor.memoryとspark.executor.memoryOverheadの配分

spark.executors.memory = 38 * 0.90

                       = 31GB

spark.yarn.executor.memoryOverhead = 38 * 0.10

                                   = 3GB

となりました。

EMR上のパラメータチューニング

手動でのパラメータセット

最適なパラメータを計算できたので、sparkを起動していきましょう。EMRでは起動時にsparkのパラメータを渡すことができます。

https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/emr-spark-configure.html

起動が出来たらWebUI(port:8088)からパラメータが正しくセットできたか確認してみてください。

まとめ

sparkは奥が深く、全貌を理解することは大変ですが、その分チューニングの余地もあるのではないかと思っています。この記事がお役に立てれば幸いです。