获取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% 。
- 启动Spark应用
确保你已经安装好Spark,并且配置好与YARN的连接。用如下简单的Spark应用示例来获取 SparkContext :
from pyspark.sql import SparkSession
spark = SparkSession.builder
.appName(“ResourceUsage”)
.getOrCreate()
sc = spark.sparkContext
- 获取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)
- 获取集群总资源
可以使用 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())
- 计算使用比例
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}%")
- 关闭Spark应用
spark.stop()
上述代码有一些局限性:
- CPU核心的计算是基于每个执行器占用1个核心的简单假设,实际情况中,执行器的CPU分配更复杂。
- yarn 命令行输出解析较为脆弱,在不同版本或配置的集群上可能需要调整解析逻辑。不过,它展示了整体思路,可作为初步的资源监控方案。