如何在PySpark中从SparkSession获取Executor数量?
获取PySpark中Executor数量的正确方式
直接读取spark.executor.instances拿不到值很正常,原因是这个配置项只有显式设置过(比如启动时加--num-executors参数、在SparkSession里配置、或者在spark-defaults.conf中定义)才会存在于Spark的配置集合里:
- 本地模式下:Spark默认用单线程或本地多线程运行,不会初始化这个配置项,所以读出来是None或者抛异常。
- 集群模式(YARN/K8s等):如果没手动设置,集群管理器会根据资源动态分配Executor,此时这个配置没有固定默认值,自然读不到。
下面是几种可行的获取方式:
通过Spark UI查看
打开Spark应用的UI页面(默认端口4040),点进「Executors」标签页,就能看到当前运行的Executor数量(注意要排除Driver进程)。集群模式下也可以通过YARN ResourceManager这类集群管理UI查看。用代码获取当前活跃的Executor数量
如果要在代码里拿到实时的Executor数量,可以调用Spark的内部API,示例代码:
spark = SparkSession.builder.getOrCreate() # 获取所有注册的Executor(包含Driver) executor_keys = spark.sparkContext._jsc.sc().getExecutorMemoryStatus().keySet().asScala # 减去1是去掉Driver本身 active_executors = len(executor_keys) - 1 print(f"当前活跃的Executor数量: {active_executors}")
注意:这个拿到的是当前正在运行的Executor数量,不是配置的默认值——集群模式下Executor可能随任务动态增减,数值会变化。
- 查看集群默认配置文件
如果想知道集群层面的默认配置,直接看Spark安装目录下的conf/spark-defaults.conf,或者问集群管理员。本地模式下没有默认的spark.executor.instances配置,用local[*]时会根据CPU核心数自动用对应线程数,但这不是Executor的概念——本地模式只有一个Executor进程。
内容的提问来源于stack exchange,提问作者alryosha
相关产品推荐
相关产品推荐

