PySpark得到Apache Spark运行时占用集群资源的比例的方法

获取Spark运行时占用资源

  • 通过Spark UI:Spark启动后,可访问其Web UI,通常在 http://:4040 或 http://:18080 。在"Executors"页面能看到各执行器的内存和CPU使用情况,汇总这些数据可得到Spark运行时占用集群的内存和CPU资源。
  • 使用Spark API:在Spark应用程序中,可使用 SparkContext 或 SparkSession 的相关方法。如使用 SparkContext 时,可通过 sc.getExecutorMemoryStatus 获取执行器内存状态,通过 sc.statusTracker.getExecutorInfos 获取执行器信息来推断CPU使用情况。
  • 借助监控工具:使用Prometheus、Ganglia等监控系统,可配置它们与Spark集成,能实时收集和展示Spark应用程序的资源使用指标,包括内存和CPU使用情况。

获取集群总资源

  • 对于YARN集群:可访问YARN的ResourceManager UI,一般在 http://:8088 ,在页面上可查看集群的总内存和CPU资源。也可使用YARN命令行工具,如 yarn node -list -all 查看节点资源信息,计算得出总资源。
  • 对于Mesos集群:可通过Mesos的Web UI,通常在 http://:5050 查看集群资源概况。还可使用Mesos的REST API获取集群资源信息。
  • 对于Kubernetes集群:可使用Kubernetes命令行工具 kubectl ,如 kubectl describe nodes 获取节点资源信息,计算集群总资源。也可通过Kubernetes API或Dashboard获取相关信息。

计算资源使用比例

  • 内存使用比例:将Spark运行时占用的内存总量除以集群总内存,公式为: 内存使用比例 = (Spark占用内存总量 / 集群总内存)× 100% 。
  • CPU使用比例:把Spark运行时使用的CPU核心数或CPU时间等指标,与集群总CPU核心数或总CPU时间对比,公式为: CPU使用比例 = (Spark占用CPU资源量 / 集群总CPU资源量)× 100% 。
  1. 启动Spark应用

确保你已经安装好Spark,并且配置好与YARN的连接。用如下简单的Spark应用示例来获取 SparkContext :

from pyspark.sql import SparkSession

spark = SparkSession.builder

.appName("ResourceUsage")

.getOrCreate()

sc = spark.sparkContext

  1. 获取Spark应用占用的资源
  • 内存:

executor_memory_status = sc.getExecutorMemoryStatus()

used_memory = sum(v.memUsed for v in executor_memory_status.values())

  • CPU:Spark本身没有直接暴露很精准的CPU使用统计,我们可以通过获取执行器数量来间接估算。每个执行器默认会占用一定数量的CPU核心,假设每个执行器占用1个核心:

executor_infos = sc.statusTracker.getExecutorInfos()

used_cpu_cores = len(executor_infos)

  1. 获取集群总资源

可以使用 yarn 命令行工具来获取集群的总内存和CPU核心数:

import subprocess

获取总内存,解析命令输出

yarn_memory_output = subprocess.check_output("yarn node -list -all | grep 'Memory' | awk '{sum += $5} END {print sum}'", shell=True)

total_memory = int(yarn_memory_output.strip())

获取总CPU核心数,解析命令输出

yarn_cpu_output = subprocess.check_output("yarn node -list -all | grep 'VCores' | awk '{sum += $5} END {print sum}'", shell=True)

total_cpu_cores = int(yarn_cpu_output.strip())

  1. 计算使用比例

memory_usage_ratio = (used_memory / total_memory) * 100 if total_memory > 0 else 0

cpu_usage_ratio = (used_cpu_cores / total_cpu_cores) * 100 if total_cpu_cores > 0 else 0

print(f"内存使用比例: {memory_usage_ratio}%")

print(f"CPU使用比例: {cpu_usage_ratio}%")

  1. 关闭Spark应用

spark.stop()

上述代码有一些局限性:

  • CPU核心的计算是基于每个执行器占用1个核心的简单假设,实际情况中,执行器的CPU分配更复杂。
  • yarn 命令行输出解析较为脆弱,在不同版本或配置的集群上可能需要调整解析逻辑。不过,它展示了整体思路,可作为初步的资源监控方案。
相关推荐
bamb006 分钟前
一个项目带你入门AI应用开发01
python
05664617 分钟前
Python康复训练——常用标准库
开发语言·python·学习
昆曲之源_娄江河畔31 分钟前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql
0566461 小时前
Python康复训练——控制流与函数
开发语言·python·学习
事变天下1 小时前
迈瑞的足球之夏:从一次救援到全球守护
大数据·科技
天使day1 小时前
FastAPI快速入门
python·fastapi
databook1 小时前
用相关性分析消除“冗余特征”
python·机器学习·scikit-learn
中微极客2 小时前
多智能体编排实战:CrewAI vs AutoGen(2026版)
大数据·网络·人工智能
用户3610588626122 小时前
Spark 核心之 Standalone-Cluster 模式:原理、流程与源码级深度拆解
spark
幻想时空2 小时前
地图数据采集
python