如何检查 Dataproc 上 pyspark 作业的每个执行程序/节点内存使用指标?

Posted

技术标签:

【中文标题】如何检查 Dataproc 上 pyspark 作业的每个执行程序/节点内存使用指标?【英文标题】:How can I inspect per executor/node memory usage metrics of a pyspark job on Dataproc? 【发布时间】:2020-10-12 23:17:27 【问题描述】:

我在 Google Cloud Dataproc 中运行一个 PySpark 作业,在一个集群中一半节点是可抢占的,并且在作业输出(驱动程序输出)中看到了几个错误,例如:

...spark.scheduler.TaskSetManager: Lost task 9696.0 in stage 0.0 ... Python worker exited unexpectedly (crashed)
   ...
Caused by java.io.EOFException
   ...

...YarnSchedulerBackend$YarnSchedulerEndpoint: Requesting driver to remove executor 177 for reason Container marked as failed: ... Exit status: -100. Diagnostics: Container released on a *lost* node

...spark.storage.BlockManagerMasterEndpoint: Error try to remove broadcast 3 from block manager BlockManagerId(...)

也许巧合,错误似乎大多来自可抢占节点。

我怀疑这些不透明的错误来自节点或执行程序内存不足,但 Dataproc 似乎没有公开任何与内存相关的细粒度指标。

如何确定为什么认为节点丢失?有没有办法可以检查每个节点或执行程序的内存使用情况,以验证这些错误是否是由高内存使用引起的?如果 YARN 是杀死容器/确定节点丢失的那个,那么希望有一种方法可以反省为什么?

【问题讨论】:

【参考方案1】:

因为您使用的是Preemptible VMs,它们的寿命很短,并且保证可以持续长达 24 小时。这意味着当 GCE 关闭 Preemptible VM 时,您会看到如下错误:

YarnSchedulerBackend$YarnSchedulerEndpoint:请求驱动程序删除执行程序 177,原因是容器标记为失败:... 退出状态:-100。诊断:容器在 lost 节点上释放

【讨论】:

【参考方案2】:

打开一个从您的机器到集群的安全外壳。您需要为此安装 gcloud sdk。

gcloud compute ssh $HOSTNAME-m --project=$PROJECT

然后在集群中运行以下命令。

列出集群中的所有节点

yarn node -list 

然后使用$NodeID 获取节点状态报告。

yarn node -status $NodeID

您也可以将local port forwarding via SSH 设置为 Yarn WebUI 服务器,而不是直接在集群中运行命令。

gcloud compute ssh $HOSTNAME-m \ 
    --project=$PROJECT -- \ 
    -L 8088:$HOSTNAME-m:8088 -N

然后在浏览器中转到http://localhost:8088/cluster/apps。

【讨论】:

以上是关于如何检查 Dataproc 上 pyspark 作业的每个执行程序/节点内存使用指标?的主要内容,如果未能解决你的问题,请参考以下文章

Dataproc Pyspark 作业仅在一个节点上运行

如何提交依赖于 google dataproc 集群的 pyspark 作业

Dataproc 上的 PySpark 因 SocketTimeoutException 而停止

使用PySpark的ETL雪花作业在本地而不在Dataproc上工作

在不使用 Dataproc 的情况下将 GCP 与 PySpark 连接

在 Google Cloud Dataproc 上安装 pyspark 导致“搜索时找不到有效的 SPARK_HOME ['/tmp', '/usr/local/bin']”