如何从SparkSession中获取Job ID或Application ID?
SparkSession 获取 Job ID 和 Application ID 的方法
当然可以!在 Spark 2.x 及后续版本中,SparkSession 作为统一的编程入口,完全支持获取 Application ID 和 Job ID,下面具体说明:
获取 Application ID
Application ID 是整个 Spark 应用的唯一标识,你可以通过 SparkSession 直接访问其底层的 SparkContext 来获取,和你之前用 SparkContext 的方式本质一致:
示例代码
// 假设你的 SparkSession 实例名为 spark val appId = spark.sparkContext.applicationId // 输出类似: app-20150224184813-11531
你之前使用 SparkContext 的方式是:
val appId = sc.applicationId // 输出类似: app-20150224184813-11531
两者获取的是同一个值,因为同一应用内 SparkSession 关联的 SparkContext 和你直接创建的 sc 是同一个实例。
获取 Job ID
Job ID 是每个 Spark 作业(触发 action 操作的任务)的唯一标识,它在作业提交时动态生成,同样可以通过 SparkSession 关联的 SparkContext 来获取,常见方式有两种:
方式1:通过 SparkListener 监听作业事件
自定义一个监听器,在作业启动时获取 Job ID:
import org.apache.spark.scheduler.{SparkListener, SparkListenerJobStart} // 自定义监听器 val jobListener = new SparkListener { override def onJobStart(jobStart: SparkListenerJobStart): Unit = { val jobId = jobStart.jobId println(s"当前启动的作业 ID: $jobId") } } // 给 SparkSession 的 SparkContext 添加监听器 spark.sparkContext.addSparkListener(jobListener)
方式2:结合 Action 操作获取
当你调用 Dataset/DataFrame 的 action 操作(比如 count()、show())时,也可以通过 SparkContext 的相关 API 捕获作业元数据。需要注意的是,Job ID 是作业级别的,同一个应用内可以生成多个不同的 Job ID,而 Application ID 是整个应用生命周期内唯一的。
内容的提问来源于stack exchange,提问作者Jill Clover
相关产品推荐
相关产品推荐

