こんにちは。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つあり、
- インスタンスのメモリとはyarn.nodemanager.resource.memory-mbに設定された数値です。(こちらにインスタンスタイプの一覧があります)
- 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は奥が深く、全貌を理解することは大変ですが、その分チューニングの余地もあるのではないかと思っています。この記事がお役に立てれば幸いです。