Spark 3.3.1:如何通过SparkContext编程获取默认池调度模式?
问题:Spark 3.3.1中如何编程获取default池的调度模式
我正尝试通过SparkContext以编程方式获取默认池的调度模式,但在配置多个池的场景下,sc.get("spark.scheduler.mode")似乎无法生效。请问在Spark 3.3.1版本中,如何以编程方式获取default池的调度模式?
解决方案
在多资源池配置的场景下,spark.scheduler.mode是集群级别的全局调度模式配置,无法直接通过它获取单个资源池的调度规则。要获取default池的调度模式,推荐以下两种方法:
方法一:调用Spark UI REST API(生产环境推荐)
Spark提供了REST API用于查询集群和应用的详细信息,其中包含资源池的配置数据。你可以向Spark Master的UI端口(默认8080)发送请求,路径为/api/v1/applications/<你的应用ID>/pool/default,解析返回的JSON数据中的schedulingMode字段即可得到结果。
Python示例代码
import requests # 替换为你的Spark Master地址和目标应用ID master_address = "http://your-spark-master:8080" target_app_id = "application_xxxxxxxxx_xxxx" # 发送请求获取default池信息 response = requests.get(f"{master_address}/api/v1/applications/{target_app_id}/pool/default") if response.status_code == 200: pool_details = response.json() default_mode = pool_details["schedulingMode"] print(f"Default池调度模式:{default_mode}") else: print("获取池信息失败,请检查地址和应用ID是否正确")
方法二:通过反射访问内部私有API(仅测试/临时场景使用)
Spark内部的TaskSchedulerImpl和Pool类包含资源池的调度模式信息,但这些属于私有API,没有版本兼容性保证,升级Spark后可能失效。如果是测试场景,可以用反射来获取:
Scala示例代码
import org.apache.spark.scheduler.{Pool, TaskSchedulerImpl} // 获取TaskScheduler实例并强转为TaskSchedulerImpl val taskScheduler = sc.taskScheduler.asInstanceOf[TaskSchedulerImpl] // 从根池获取default子池 val defaultPool = taskScheduler.rootPool.getChild("default").asInstanceOf[Pool] // 获取调度模式 val schedulingMode = defaultPool.schedulingMode.toString println(s"Default池调度模式:$schedulingMode")
内容的提问来源于stack exchange,提问作者kumar_m_kiran
相关产品推荐
相关产品推荐

