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 命令行输出解析较为脆弱,在不同版本或配置的集群上可能需要调整解析逻辑。不过,它展示了整体思路,可作为初步的资源监控方案。
相关推荐
问商十三载7 小时前
AI引擎生成式优化实践:刑事辩护律师团队IP构建
大数据·人工智能
会议咨询8 小时前
2026年大数据、信息系统与智能通信国际会议(BDIIC 2026)
大数据·信息系统·智能通信
Raas1008 小时前
MAI Gateway(魔芋企业级AI网关)能力解析:AI网关能做故障转移吗?AI网关核心功能详解
大数据·人工智能·网关·ai·gateway·mai gateway
全栈练习生8 小时前
AI Agent 沙箱
python·ai
IT研究所9 小时前
AI-ITR平台如何减少客户问题反复升级?
大数据·运维·人工智能·低代码·自然语言处理·安全架构·企微
SEO_juper9 小时前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
回眸&啤酒鸭10 小时前
【回眸】OpenSwarm 多智能体协作系统实战指南
大数据·前端·人工智能
大大大大晴天10 小时前
每天认识一个组件:Apache DolphinScheduler
大数据
用户83562907805111 小时前
使用 Python 对 Excel 工作表进行排序
后端·python
yumgpkpm11 小时前
Acceldata ODP(Open Data Platform)3.3.6.4(RHEL9)保姆级完整安装手册
大数据·人工智能·hive·hadoop·kafka·hbase·cloudera