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 命令行输出解析较为脆弱,在不同版本或配置的集群上可能需要调整解析逻辑。不过,它展示了整体思路,可作为初步的资源监控方案。
相关推荐
棒棒的皮皮11 分钟前
【Python】Open3d用于3D测高项目
python·3d·open3d
CodeLongBear21 分钟前
Python数据分析: 数据可视化入门:Matplotlib基础操作与多坐标系实战
python·信息可视化·数据分析
李晨卓1 小时前
python学习之不同储存方式的操作方法
python·代码规范
站大爷IP1 小时前
实战:爬取某联招聘职位需求并生成词云——从零开始的完整指南
python
deephub1 小时前
从零开始:用Python和Gemini 3四步搭建你自己的AI Agent
人工智能·python·大语言模型·agent
咕白m6251 小时前
Python 实现 PDF 页面旋转
python
c***87192 小时前
Flask:后端框架使用
后端·python·flask
天硕国产存储技术站2 小时前
DualPLP 双重掉电保护赋能 天硕工业级SSD筑牢关键领域安全存储方案
大数据·人工智能·安全·固态硬盘
雷文成.思泉软件2 小时前
以ERP为核心、企微为门户,实现一体化集成
大数据·低代码·创业创新
Q_Q5110082853 小时前
python+django/flask的情绪宣泄系统
spring boot·python·pycharm·django·flask·node.js·php