SPARK:Pyspark:如何监控 python 工作进程

5 python apache-spark pyspark

问题
如何监控 pyspark python 工作进程的 CPU 和内存使用情况。

详细信息
根据此文档,一个 SPARK 工作线程可以包含 1 个或多个 python 进程。

假设我们为每个在可用内存高达 200g 的工作线程上运行的执行程序分配了 40g 内存。然后根据这个记录的设置:“spark.python.worker.memory”,我们可以设置每个 python 进程的可用内存量。

引用spark.python.worker.memory设置说明:

聚合期间每个 python 工作进程使用的内存量,格式与 JVM 内存字符串相同(例如 512m、2g)。如果聚合期间使用的内存超过此数量,则会将数据溢出到磁盘中。

假设我们将spark.python.worker.memory设置为2g。

对我来说,出现以下问题:

  • 我们如何知道每个工作程序/执行程序上生成了多少个 pyspark/spark 进程?
  • 我们如何监控每个进程消耗的内存量以及整体消耗的内存量,以了解我们距离我们设置的“执行程序 40g”限制有多近?
  • 我们如何监控每个进程向磁盘溢出的数据量?
  • 更一般地说,我们如何使用spark.python.worker.memory设置来优化pyspark应用程序。这只是一个尝试/错误的问题吗?如果是这样,如何进行基准测试/监控(类似于上面)



为什么......我们遇到了一些特定于我们的应用程序的性能问题。我们观察到一些无法重现的不一致错误。因此,我们必须监视/了解每次应用程序运行时发生的情况的更详细信息。

小智 3

根据此记录的设置:“spark.python.worker.memory”,我们能够设置每个 python 进程的可用内存量。

这不是真的。正如您所链接的文档中所解释的,此设置用于控制聚合行为,而不是一般的 Python 工作内存。

此内存占本地对象或广播变量的大小,仅用于聚合的临时结构。

我们如何知道每个工作程序/执行程序上生成了多少个 pyspark/spark 进程?

Python 工作线程的生成数量不得超过可用核心数量设置的限制。由于工作人员可以在运行时启动或终止,因此峰值负载之外的实际工作人员数量可能会更少。

我们如何监控每个进程消耗的内存量以及整体消耗的内存量,以了解我们距离我们设置的“执行程序 40g”限制有多近?

Spark 没有具体的答案。您可以使用resource应用程序本身的通用监控工具或模块。

我们如何监控每个进程向磁盘溢出的数据量?

您可以使用 Spark REST API来获得一些见解,但一般来说 PySpark 指标有些有限。