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 命令行输出解析较为脆弱,在不同版本或配置的集群上可能需要调整解析逻辑。不过,它展示了整体思路,可作为初步的资源监控方案。
相关推荐
踏着七彩祥云的小丑4 小时前
pytest——Mark标记
开发语言·python·pytest
网教盟人才服务平台4 小时前
“方班预备班盾立方人才培养计划”正式启动!
大数据·人工智能
不爱吃炸鸡柳5 小时前
Python入门第一课:零基础认识Python + 环境搭建 + 基础语法精讲
开发语言·python
TDengine (老段)5 小时前
TDengine IDMP 可视化 —— 分享
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·时序数据
Dxy12393102165 小时前
Python基于BERT的上下文纠错详解
开发语言·python·bert
运维行者_6 小时前
OpManager MSP NetFlow Analyzer集成解决方案,应对多客户端网络流量监控挑战
大数据·运维·服务器·网络·数据库·自动化·运维开发
SiYuanFeng6 小时前
Colab复现 NanoChat:从 Tokenizer(CPU)、Base Train(CPU) 到 SFT(GPU) 的完整踩坑实录
python·colab
炸炸鱼.7 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
_深海凉_8 小时前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦8 小时前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw