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 命令行输出解析较为脆弱,在不同版本或配置的集群上可能需要调整解析逻辑。不过,它展示了整体思路,可作为初步的资源监控方案。
相关推荐
Rose 使者4 分钟前
今日实时汇率查询接口如何用Python实现调用?
python·api·汇率查询
惜鸟7 分钟前
Pydantic 的 BaseSettings 配置解析
后端·python
MYH51616 分钟前
拉力测试cuda pytorch 把 4070显卡拉满
人工智能·pytorch·python
某人辛木21 分钟前
基于tensorflow实现的猫狗识别
人工智能·python·tensorflow
大白爱琴24 分钟前
使用python进行图像处理—图像变换(6)
图像处理·人工智能·python
TDengine (老段)26 分钟前
TDengine 开发指南—— UDF函数
java·大数据·数据库·物联网·数据分析·tdengine·涛思数据
月忆36436 分钟前
等待组(waitgroup)
前端·爬虫·python
Stanford_110642 分钟前
关于大数据的基础知识(二)——国内大数据产业链分布结构
大数据·开发语言·物联网·微信小程序·微信公众平台·twitter·微信开放平台
一个何包蛋!!42 分钟前
相关类相关的可视化图像总结
开发语言·python·数据可视化
技术便签43 分钟前
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
人工智能·python·ai编程·agi·多智能体·智能体·adk