Spark执行内存监控

Spark execution memory monitoring

我想要的是能够监控 Spark 执行内存,而不是 SparkUI 中可用的 存储内存 .我的意思是,执行内存不是执行程序内存

执行内存是指:

This region is used for buffering intermediate data when performing shuffles, joins, sorts and aggregations. The size of this region is configured through spark.shuffle.memoryFraction (default0.2). According to: Unified Memory Management in Spark 1.6

在对答案进行大量搜索之后,我只找到了未回答的 Whosebug 问题、仅与存储内存相关的答案或 use Ganglia、[=49= 类型的模糊答案]使用 Cloudera 控制台 等...

Stack Overflow 上似乎需要此信息,但没有一个令人满意的答案可用。以下是搜索时 Whosebug 的一些热门帖子 monitoring spark memory

监控Spark执行和存储内存利用率

监控 Spark 作业的内存使用情况

SPARK:如何监控Spark集群的内存消耗?

Spark - 监控实际使用的执行程序内存

如何监控 spark 应用程序的内存和 CPU 使用情况?

Spark 应用程序如何获取内存和 cpu 使用情况?

问题

Spark 版本 > 2.0

  1. 是否可以监控 Spark 作业的执行内存?通过监控我的意思是至少看到 used/available 就像在 SparkUI 的执行器选项卡中每个执行器的存储内存一样。是或否?

  2. 我可以用 SparkListeners (@JacekLaskowski 吗?) history-server 怎么样?或者唯一的方法是通过外部工具? Graphana、Ganglia 等?如果是外部工具,能否请您指向一个教程或提供一些更详细的指南?

  3. 我看到了这个SPARK-9103 Tracking spark's memory usage seems like it is not yet possible to monitor execution memory. Also this seems relevant SPARK-23206 Additional Memory Tuning Metrics

  4. Peak Execution memory 是否是对任务中执行内存的 usage/occupation 的可靠估计?例如,如果 Stage UI 表示任务在峰值时使用 1 Gb,而我每个执行程序有 5 cpu,这是否意味着我需要至少 5 Gb 的执行内存可用于每个执行程序才能完成舞台?

  5. 我们可以使用其他一些代理来了解执行内存吗?

  6. 有没有办法知道执行内存何时开始吞噬存储内存?当我缓存的 table 从 SparkUI 的 Storage 选项卡中消失或者只剩下一部分时,是否意味着它被执行内存驱逐了?

回答我自己的问题以供将来参考:

我们使用 Mesos 作为集群管理器。在 Mesos UI 中,我找到了一个页面,其中列出了给定工作程序上的所有执行程序,并且可以找到执行程序的内存使用情况。它似乎是一个总内存使用存储+执行。我可以清楚地看到,当内存填满时,执行程序就死了。

要访问:

  • 转到列出所有集群工作程序的“代理”选项卡
  • 选择工人
  • 选择框架 - 与您的脚本同名的框架
  • 在里面,您将有一个针对您的工作 运行 的执行者列表。
  • 有关内存使用情况,请参阅:内存(已使用/已分配)

驱动程序也可以这样做。对于框架,您选择名称为 Spark Cluster

的框架

如果您想知道如何以编程方式提取此数字,请参阅我对这个问题的回复:如何获取 Mesos Agents Framework Executor Memory

我为执行程序启用了 Spark 内部指标,我可以获得有关 JVMHeapMemory、jvm.heap.usage、OnHeapExecutionMemory、OnHeapStroageMemory 和 OnHeapUnifiedMemory 的信息以供我研究。请参阅文档 (https://spark.apache.org/docs/3.0.0-preview/monitoring.html) 了解更多信息。