Dataprocで Spark を利用することがあるのですが、メモリに関する設定でいつもよく分からなくなるので、備忘録的に残しておきます。Resource Managerに Hadoop Yarn を利用しているケースになります。

メモリ設定の包含関係

Sparkに関する設定はこちら、Yarnに関する設定はこちらに書いてあります。

各Executorノードのメモリ設定は以下のような包含関係になっているようです。

マシンメモリ
OS その他 yarn.nodemanager.resource.memory-mb
コンテナに割り当て可能な物理メモリ
spark.executor.memoryOverhead
1ExecutorあたりのVMオーバーヘッド、インターン化文字列、その他Nativeオーバヘッドなど
spark.executor.memory
1Executorが利用する最大メモリサイズ
spark.executor.memory - spark.executor.memory * spark.memory.fraction
Reserved領域。ユーザデータ構造、Sparkの内部メタデータ、予期しない巨大レコードによるOOMからの保護など。
spark.executor.memory * spark.memory.fraction
Sparkアプリケーションが利用する領域。割合で指定
spark.executor.memory * spark.memory.fraction * spark.memory.storageFractionRDDを格納する領域。割合で指定 アプリ実行用ワーキングメモリ
  • yarn.nodemanager.resource.memory-mb
    • yarn.nodemanager.resource.memory-mb > spark.executor.memoryOverhead + spark.executor.memoryが成り立つ必要あり
    • Dataprocだとマシンメモリサイズの0.8がデフォルト値らしい
  • spark.executor.memoryOverhead
    • 通常spark.executor.memoryの6〜10%程度、最大25%まで設定可能
    • Container killed by YARN for exceeding memory limits. x.x GB of x GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead or disabling yarn.nodemanager.vmem-check-enabled because of YARN-4714.みたいなエラーが出るときに25%になるように設定したら、エラーが出なくなったことあり
  • spark.executor.memory
    • 1Executorの設定であることに注意
    • x.x GB of x GB physical memory used.みたいなエラーが出るときは、この値を増やす必要あり
  • spark.memory.fraction
    • デフォルトは0.6。ほとんどのワークロードではこれで十分なので普通変更しない。この値が小さいとキャッシュからこぼれ落ちる頻度が高くなり、GCが頻繁に発生するようです
  • spark.memory.storageFraction
    • デフォルトは0.5。ほとんどのワークロードではこれで十分なので普通変更しない。この値を大きくすると、アプリ実行用のワーキングメモリが小さくなるので、スワップアウト・スワップインの頻度が上がるようです

参考サイト

以下のサイトをはじめ色々なサイトを参考にさせていただきました。ありがとうございます。