2017-04-08 149 views
2

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

详细信息
根据this doc,一个SPARK工作者可以包含一个或多个python进程。

我们假设我们已经为每个执行器分配了40g内存,这个执行器在一个拥有最多200g内存的工作器上运行。然后根据这个文档设置:“spark.python.worker.memory”,我们可以设置每个python进程的可用内存量。

从spark.python.worker.memory设置描述引用:SPARK:Pyspark:如何监控python工作进程

的存储器聚集期间每蟒工作进程使用,在相同的格式JVM存储器串(例如512M,2克)的量。如果聚合过程中使用的内存高于此数量,则会将数据泄漏到磁盘中。

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

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

  • 我们怎么知道有多少进程pyspark /火花在每个工人/执行人产卵?
  • 我们如何监控每个流程消耗的内存量以及整体情况,看看我们设置的“执行程序40g”限制有多接近?
  • 我们如何监控每个进程溢出的磁盘数量?
  • 更一般地说,我们如何使用spark.python.worker.memory设置来优化或pyspark应用程序。这只是一个试验/错误的问题。如果是这样,怎么可以基准/监控(类似于以上)



为什么..好,我们打的是非常具体到我们的应用程序的一些性能问题。我们正在观察一些我们无法再现的不一致的错误。因此,我们必须监视/理解每次运行应用程序时发生的事情的更精细的细节。

回答

0

根据此文档设置:“spark.python.worker.memory”,我们可以设置每个python进程的可用内存量。

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

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

我们如何知道pyspark/spark在每个worker/executor上产生了多少个进程?

Python工作者可以产生达到由可用内核数量设置的限制。由于工作人员在运行期间可能会被启动或死亡,因此峰值负载以外的实际工人数量可能会更小。

我们应该如何监控每个进程消耗的内存量以及总体来看看我们设置的“执行程序40g”限制有多接近?

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

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

您可以使用Spark REST API来获得一些见解,但通常PySpark度量标准是有限的。