This is an automated email from the ASF dual-hosted git repository.

mridulm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git


The following commit(s) were added to refs/heads/master by this push:
     new 90fce00c984d [SPARK-54879][CORE] Add final status to Spark History 
Server for failed executions
90fce00c984d is described below

commit 90fce00c984d47141c52ea62302b9b5d072a3335
Author: Rob Reeves <[email protected]>
AuthorDate: Sat Jun 27 00:32:51 2026 -0500

    [SPARK-54879][CORE] Add final status to Spark History Server for failed 
executions
    
    ### What changes were proposed in this pull request?
    This adds the final application status to SHS for failures with non-zero 
exit codes to improve debugging.
    
    #### Decisions made
    At first I wanted to always include the final exit code. When using 
spark-submit in local mode I found that throwing driver exceptions can result 
in exit code 0. This would be confusing because the status would show as a 
success. Instead, I decided to scope this to only showing the final status for 
known failures. Ideally, a future enhancement can be made to not use exit code 
0 for failed executions for all cases, but this is a riskier breaking change 
that I did not want to make here.
    
    #### Possible future extensions
    Right now I only show the exit code for explicit failures (non-zero exit 
code). There are some cases I wanted to solve, but require more foundational 
work.
    
    1. Help users understand when a driver crashed. Right now SHS will show the 
app as still running. This is another reason I didn't want to show the status 
outside of known failures. This is tricky and I wanted to infer it based on the 
time gap between the last event in the event log and current time, but that 
information is not there now (and I'm not sure on the approach).
    2. Enhance exit codes to never use 0 during a failure so it can help users 
debug more scenarios.
    3. Instead of just showing an exit code, map it to its meaning. This 
requires more work since it is resource manager specific.
    
    ### Why are the changes needed?
    If a Spark job fails due to an issue on the driver side (e.g. during the 
commit phase, custom driver code) this is not surfaced anywhere in SHS. This 
becomes even more confusing when a query/job has run successfully. SHS will 
show all jobs as completed successfully  and the only way to know the job 
failed is to look in the logs. Before this change this is what a failed driver 
side application would look like in SHS. It looks like a success.
    <img width="961" height="417" alt="before" 
src="https://github.com/user-attachments/assets/8d233666-b5cf-4268-ad2e-69184a7eb04d";
 />
    
    After the change this is what it looks like:
    <img width="1041" height="514" alt="after" 
src="https://github.com/user-attachments/assets/44b8aa13-2c85-4438-bb21-85d6b9f0c33c";
 />
    
    ### Does this PR introduce _any_ user-facing change?
    
    Yes, it adds the application final status to the SHS overview when an 
execution fails and has a non-zero exit code.
    
    ### How was this patch tested?
    
    Unit tests and manually tested SHS.
    
    ### Was this patch authored or co-authored using generative AI tooling?
    
    Generated-by: Claude Code 2.0.76
    
    Closes #53657 from robreeves/shs_final_status.
    
    Authored-by: Rob Reeves <[email protected]>
    Signed-off-by: Mridul Muralidharan <mridul<at>gmail.com>
---
 .../apache/spark/status/protobuf/store_types.proto |  1 +
 .../spark/deploy/history/FsHistoryProvider.scala   |  3 ++
 .../apache/spark/status/AppStatusListener.scala    |  3 +-
 .../scala/org/apache/spark/status/api/v1/api.scala |  1 +
 .../ApplicationInfoWrapperSerializer.scala         |  4 +-
 .../org/apache/spark/ui/jobs/AllJobsPage.scala     | 29 ++++++++++++
 .../application_list_json_expectation.json         | 19 ++++++++
 .../completed_app_list_json_expectation.json       | 19 ++++++++
 .../limit_app_list_json_expectation.json           | 36 ++++++++-------
 .../minDate_app_list_json_expectation.json         | 19 ++++++++
 .../minEndDate_app_list_json_expectation.json      | 19 ++++++++
 ...p_with_non_zero_exit_code_json_expectation.json | 19 ++++++++
 .../resources/spark-events/local-1430917381536     | 53 ++++++++++++++++++++++
 .../deploy/history/FsHistoryProviderSuite.scala    |  9 ++--
 .../spark/deploy/history/HistoryServerSuite.scala  |  1 +
 .../spark/status/AppStatusListenerSuite.scala      |  4 +-
 .../protobuf/KVStoreProtobufSerializerSuite.scala  |  3 +-
 dev/.rat-excludes                                  |  1 +
 project/MimaExcludes.scala                         |  3 ++
 19 files changed, 221 insertions(+), 25 deletions(-)

diff --git 
a/core/src/main/protobuf/org/apache/spark/status/protobuf/store_types.proto 
b/core/src/main/protobuf/org/apache/spark/status/protobuf/store_types.proto
index 2b6ac763cc3e..ae020e74f8c6 100644
--- a/core/src/main/protobuf/org/apache/spark/status/protobuf/store_types.proto
+++ b/core/src/main/protobuf/org/apache/spark/status/protobuf/store_types.proto
@@ -213,6 +213,7 @@ message ApplicationAttemptInfo {
   optional string spark_user = 6;
   bool completed = 7;
   optional string app_spark_version = 8;
+  optional int32 exit_code = 9;
 }
 
 message ApplicationInfo {
diff --git 
a/core/src/main/scala/org/apache/spark/deploy/history/FsHistoryProvider.scala 
b/core/src/main/scala/org/apache/spark/deploy/history/FsHistoryProvider.scala
index 79687bae0a10..a87db3557553 100644
--- 
a/core/src/main/scala/org/apache/spark/deploy/history/FsHistoryProvider.scala
+++ 
b/core/src/main/scala/org/apache/spark/deploy/history/FsHistoryProvider.scala
@@ -1859,6 +1859,7 @@ private[history] class AppListingListener(
     attempt.lastUpdated = new Date(reader.modificationTime)
     attempt.duration = event.time - attempt.startTime.getTime()
     attempt.completed = true
+    attempt.exitCode = event.exitCode
   }
 
   override def onEnvironmentUpdate(event: SparkListenerEnvironmentUpdate): 
Unit = {
@@ -1926,6 +1927,7 @@ private[history] class AppListingListener(
     var duration = 0L
     var sparkUser: String = null
     var completed = false
+    var exitCode = Option.empty[Int]
     var appSparkVersion = ""
 
     var adminAcls: Option[String] = None
@@ -1944,6 +1946,7 @@ private[history] class AppListingListener(
         sparkUser,
         completed,
         appSparkVersion,
+        exitCode,
         Some(logSourceName),
         Some(logSourceFullPath))
       new AttemptInfoWrapper(
diff --git 
a/core/src/main/scala/org/apache/spark/status/AppStatusListener.scala 
b/core/src/main/scala/org/apache/spark/status/AppStatusListener.scala
index 5674798f0209..ee887a4cda73 100644
--- a/core/src/main/scala/org/apache/spark/status/AppStatusListener.scala
+++ b/core/src/main/scala/org/apache/spark/status/AppStatusListener.scala
@@ -199,7 +199,8 @@ private[spark] class AppStatusListener(
       event.time - old.startTime.getTime(),
       old.sparkUser,
       true,
-      old.appSparkVersion)
+      old.appSparkVersion,
+      event.exitCode)
 
     appInfo = v1.ApplicationInfo(
       appInfo.id,
diff --git a/core/src/main/scala/org/apache/spark/status/api/v1/api.scala 
b/core/src/main/scala/org/apache/spark/status/api/v1/api.scala
index f3fb916f0820..3e7f5e6d2ec3 100644
--- a/core/src/main/scala/org/apache/spark/status/api/v1/api.scala
+++ b/core/src/main/scala/org/apache/spark/status/api/v1/api.scala
@@ -54,6 +54,7 @@ case class ApplicationAttemptInfo private[spark](
     sparkUser: String,
     completed: Boolean = false,
     appSparkVersion: String,
+    exitCode: Option[Int] = None,
     logSourceName: Option[String] = None,
     logSourceFullPath: Option[String] = None) {
 
diff --git 
a/core/src/main/scala/org/apache/spark/status/protobuf/ApplicationInfoWrapperSerializer.scala
 
b/core/src/main/scala/org/apache/spark/status/protobuf/ApplicationInfoWrapperSerializer.scala
index cf3159c7b481..8526e9459472 100644
--- 
a/core/src/main/scala/org/apache/spark/status/protobuf/ApplicationInfoWrapperSerializer.scala
+++ 
b/core/src/main/scala/org/apache/spark/status/protobuf/ApplicationInfoWrapperSerializer.scala
@@ -95,6 +95,7 @@ private[protobuf] class ApplicationInfoWrapperSerializer
     info.attemptId.foreach{ id =>
       builder.setAttemptId(id)
     }
+    info.exitCode.foreach(builder.setExitCode)
     builder.build()
   }
 
@@ -110,7 +111,8 @@ private[protobuf] class ApplicationInfoWrapperSerializer
       duration = info.getDuration,
       sparkUser = getStringField(info.hasSparkUser, () => info.getSparkUser),
       completed = info.getCompleted,
-      appSparkVersion = getStringField(info.hasAppSparkVersion, () => 
info.getAppSparkVersion)
+      appSparkVersion = getStringField(info.hasAppSparkVersion, () => 
info.getAppSparkVersion),
+      exitCode = if (info.hasExitCode) Some(info.getExitCode) else None
     )
   }
 }
diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/AllJobsPage.scala 
b/core/src/main/scala/org/apache/spark/ui/jobs/AllJobsPage.scala
index 75115ed4366e..6b9cb41633d1 100644
--- a/core/src/main/scala/org/apache/spark/ui/jobs/AllJobsPage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/jobs/AllJobsPage.scala
@@ -278,6 +278,7 @@ private[ui] class AllJobsPage(parent: JobsTab, store: 
AppStatusStore) extends We
     val startDate = appInfo.attempts.head.startTime
     val startTime = startDate.getTime()
     val endTime = appInfo.attempts.head.endTime.getTime()
+    val exitCode = appInfo.attempts.head.exitCode
 
     val activeJobs = new ListBuffer[v1.JobData]()
     val completedJobs = new ListBuffer[v1.JobData]()
@@ -321,6 +322,34 @@ private[ui] class AllJobsPage(parent: JobsTab, store: 
AppStatusStore) extends We
     val summary: NodeSeq =
       <div>
         <ul class="list-unstyled">
+          <li>
+            <strong>User:</strong>
+            {parent.getSparkUser}
+          </li>
+          <li>
+            <strong>Started At:</strong>
+            {UIUtils.formatDate(startDate)}
+          </li>
+          <li>
+            <strong>Total Uptime:</strong>
+            {
+              if (endTime < 0 && parent.sc.isDefined) {
+                UIUtils.formatDuration(System.currentTimeMillis() - startTime)
+              } else if (endTime > 0) {
+                UIUtils.formatDuration(endTime - startTime)
+              }
+            }
+          </li>
+          {
+            exitCode match {
+              case Some(code) if code != 0 =>
+                <li>
+                  <strong>Exit Code:</strong>
+                  {code.toString}
+                </li>
+              case _ => <!-- -->
+            }
+          }
           <li>
             <strong>Scheduling Mode: </strong>
             {schedulingMode}
diff --git 
a/core/src/test/resources/HistoryServerExpectations/application_list_json_expectation.json
 
b/core/src/test/resources/HistoryServerExpectations/application_list_json_expectation.json
index ac6e5c63c0b6..9da4c43affe8 100644
--- 
a/core/src/test/resources/HistoryServerExpectations/application_list_json_expectation.json
+++ 
b/core/src/test/resources/HistoryServerExpectations/application_list_json_expectation.json
@@ -1,4 +1,22 @@
 [ {
+  "attempts" : [ {
+    "appSparkVersion" : "3.5.2",
+    "completed" : true,
+    "duration" : 221145,
+    "endTime" : "2026-06-23T17:34:35.148GMT",
+    "endTimeEpoch" : 1782236075148,
+    "exitCode" : 1,
+    "logSourceFullPath" : "",
+    "logSourceName" : "",
+    "lastUpdated" : "",
+    "lastUpdatedEpoch" : 0,
+    "sparkUser" : "spark",
+    "startTime" : "2026-06-23T17:30:54.003GMT",
+    "startTimeEpoch" : 1782235854003
+  } ],
+  "id" : "local-1430917381536",
+  "name" : "Spark shell"
+}, {
   "attempts" : [ {
     "appSparkVersion" : "4.2.0-SNAPSHOT",
     "logSourceFullPath" : "",
@@ -7,6 +25,7 @@
     "duration" : 2006,
     "endTime" : "2025-12-27T14:15:12.221GMT",
     "endTimeEpoch" : 1766844912221,
+    "exitCode" : 0,
     "lastUpdated" : "",
     "lastUpdatedEpoch" : 0,
     "sparkUser" : "<script>alert('XSS')</script>",
diff --git 
a/core/src/test/resources/HistoryServerExpectations/completed_app_list_json_expectation.json
 
b/core/src/test/resources/HistoryServerExpectations/completed_app_list_json_expectation.json
index ac6e5c63c0b6..9da4c43affe8 100644
--- 
a/core/src/test/resources/HistoryServerExpectations/completed_app_list_json_expectation.json
+++ 
b/core/src/test/resources/HistoryServerExpectations/completed_app_list_json_expectation.json
@@ -1,4 +1,22 @@
 [ {
+  "attempts" : [ {
+    "appSparkVersion" : "3.5.2",
+    "completed" : true,
+    "duration" : 221145,
+    "endTime" : "2026-06-23T17:34:35.148GMT",
+    "endTimeEpoch" : 1782236075148,
+    "exitCode" : 1,
+    "logSourceFullPath" : "",
+    "logSourceName" : "",
+    "lastUpdated" : "",
+    "lastUpdatedEpoch" : 0,
+    "sparkUser" : "spark",
+    "startTime" : "2026-06-23T17:30:54.003GMT",
+    "startTimeEpoch" : 1782235854003
+  } ],
+  "id" : "local-1430917381536",
+  "name" : "Spark shell"
+}, {
   "attempts" : [ {
     "appSparkVersion" : "4.2.0-SNAPSHOT",
     "logSourceFullPath" : "",
@@ -7,6 +25,7 @@
     "duration" : 2006,
     "endTime" : "2025-12-27T14:15:12.221GMT",
     "endTimeEpoch" : 1766844912221,
+    "exitCode" : 0,
     "lastUpdated" : "",
     "lastUpdatedEpoch" : 0,
     "sparkUser" : "<script>alert('XSS')</script>",
diff --git 
a/core/src/test/resources/HistoryServerExpectations/limit_app_list_json_expectation.json
 
b/core/src/test/resources/HistoryServerExpectations/limit_app_list_json_expectation.json
index 06ef3a5ecc9f..fef54a1faa3f 100644
--- 
a/core/src/test/resources/HistoryServerExpectations/limit_app_list_json_expectation.json
+++ 
b/core/src/test/resources/HistoryServerExpectations/limit_app_list_json_expectation.json
@@ -1,4 +1,22 @@
 [ {
+  "attempts" : [ {
+    "appSparkVersion" : "3.5.2",
+    "completed" : true,
+    "duration" : 221145,
+    "endTime" : "2026-06-23T17:34:35.148GMT",
+    "endTimeEpoch" : 1782236075148,
+    "exitCode" : 1,
+    "logSourceFullPath" : "",
+    "logSourceName" : "",
+    "lastUpdated" : "",
+    "lastUpdatedEpoch" : 0,
+    "sparkUser" : "spark",
+    "startTime" : "2026-06-23T17:30:54.003GMT",
+    "startTimeEpoch" : 1782235854003
+  } ],
+  "id" : "local-1430917381536",
+  "name" : "Spark shell"
+}, {
   "attempts" : [ {
     "appSparkVersion" : "4.2.0-SNAPSHOT",
     "logSourceFullPath" : "",
@@ -7,6 +25,7 @@
     "duration" : 2006,
     "endTime" : "2025-12-27T14:15:12.221GMT",
     "endTimeEpoch" : 1766844912221,
+    "exitCode" : 0,
     "lastUpdated" : "",
     "lastUpdatedEpoch" : 0,
     "sparkUser" : "<script>alert('XSS')</script>",
@@ -32,21 +51,4 @@
   } ],
   "id" : "local-1642039451826",
   "name" : "Spark shell"
-}, {
-  "attempts" : [ {
-    "appSparkVersion" : "3.1.1.119",
-    "logSourceFullPath" : "",
-    "logSourceName" : "",
-    "completed" : true,
-    "duration" : 274875,
-    "endTime" : "2021-08-10T23:29:30.208GMT",
-    "endTimeEpoch" : 1628638170208,
-    "lastUpdated" : "",
-    "lastUpdatedEpoch" : 0,
-    "sparkUser" : "john",
-    "startTime" : "2021-08-10T23:24:55.333GMT",
-    "startTimeEpoch" : 1628637895333
-  } ],
-  "id" : "application_1628109047826_1317105",
-  "name" : "Spark shell"
 } ]
diff --git 
a/core/src/test/resources/HistoryServerExpectations/minDate_app_list_json_expectation.json
 
b/core/src/test/resources/HistoryServerExpectations/minDate_app_list_json_expectation.json
index a1d2f9e9ef4d..885045f2faf5 100644
--- 
a/core/src/test/resources/HistoryServerExpectations/minDate_app_list_json_expectation.json
+++ 
b/core/src/test/resources/HistoryServerExpectations/minDate_app_list_json_expectation.json
@@ -1,4 +1,22 @@
 [ {
+  "attempts" : [ {
+    "appSparkVersion" : "3.5.2",
+    "completed" : true,
+    "duration" : 221145,
+    "endTime" : "2026-06-23T17:34:35.148GMT",
+    "endTimeEpoch" : 1782236075148,
+    "exitCode" : 1,
+    "logSourceFullPath" : "",
+    "logSourceName" : "",
+    "lastUpdated" : "",
+    "lastUpdatedEpoch" : 0,
+    "sparkUser" : "spark",
+    "startTime" : "2026-06-23T17:30:54.003GMT",
+    "startTimeEpoch" : 1782235854003
+  } ],
+  "id" : "local-1430917381536",
+  "name" : "Spark shell"
+}, {
   "attempts" : [ {
     "appSparkVersion" : "4.2.0-SNAPSHOT",
     "logSourceFullPath" : "",
@@ -7,6 +25,7 @@
     "duration" : 2006,
     "endTime" : "2025-12-27T14:15:12.221GMT",
     "endTimeEpoch" : 1766844912221,
+    "exitCode" : 0,
     "lastUpdated" : "",
     "lastUpdatedEpoch" : 0,
     "sparkUser" : "<script>alert('XSS')</script>",
diff --git 
a/core/src/test/resources/HistoryServerExpectations/minEndDate_app_list_json_expectation.json
 
b/core/src/test/resources/HistoryServerExpectations/minEndDate_app_list_json_expectation.json
index 413660c4b689..ead957a5fbbb 100644
--- 
a/core/src/test/resources/HistoryServerExpectations/minEndDate_app_list_json_expectation.json
+++ 
b/core/src/test/resources/HistoryServerExpectations/minEndDate_app_list_json_expectation.json
@@ -1,4 +1,22 @@
 [ {
+  "attempts" : [ {
+    "appSparkVersion" : "3.5.2",
+    "completed" : true,
+    "duration" : 221145,
+    "endTime" : "2026-06-23T17:34:35.148GMT",
+    "endTimeEpoch" : 1782236075148,
+    "exitCode" : 1,
+    "logSourceFullPath" : "",
+    "logSourceName" : "",
+    "lastUpdated" : "",
+    "lastUpdatedEpoch" : 0,
+    "sparkUser" : "spark",
+    "startTime" : "2026-06-23T17:30:54.003GMT",
+    "startTimeEpoch" : 1782235854003
+  } ],
+  "id" : "local-1430917381536",
+  "name" : "Spark shell"
+}, {
   "attempts" : [ {
     "appSparkVersion" : "4.2.0-SNAPSHOT",
     "logSourceFullPath" : "",
@@ -7,6 +25,7 @@
     "duration" : 2006,
     "endTime" : "2025-12-27T14:15:12.221GMT",
     "endTimeEpoch" : 1766844912221,
+    "exitCode" : 0,
     "lastUpdated" : "",
     "lastUpdatedEpoch" : 0,
     "sparkUser" : "<script>alert('XSS')</script>",
diff --git 
a/core/src/test/resources/HistoryServerExpectations/one_app_with_non_zero_exit_code_json_expectation.json
 
b/core/src/test/resources/HistoryServerExpectations/one_app_with_non_zero_exit_code_json_expectation.json
new file mode 100644
index 000000000000..9b9ee4c7ed9d
--- /dev/null
+++ 
b/core/src/test/resources/HistoryServerExpectations/one_app_with_non_zero_exit_code_json_expectation.json
@@ -0,0 +1,19 @@
+{
+  "attempts" : [ {
+    "appSparkVersion" : "3.5.2",
+    "completed" : true,
+    "duration" : 221145,
+    "endTime" : "2026-06-23T17:34:35.148GMT",
+    "endTimeEpoch" : 1782236075148,
+    "exitCode" : 1,
+    "logSourceFullPath" : "",
+    "logSourceName" : "",
+    "lastUpdated" : "",
+    "lastUpdatedEpoch" : 0,
+    "sparkUser" : "spark",
+    "startTime" : "2026-06-23T17:30:54.003GMT",
+    "startTimeEpoch" : 1782235854003
+  } ],
+  "id" : "local-1430917381536",
+  "name" : "Spark shell"
+}
diff --git a/core/src/test/resources/spark-events/local-1430917381536 
b/core/src/test/resources/spark-events/local-1430917381536
new file mode 100644
index 000000000000..c356d307895e
--- /dev/null
+++ b/core/src/test/resources/spark-events/local-1430917381536
@@ -0,0 +1,53 @@
+{"Event":"SparkListenerLogStart","Spark Version":"3.5.2"}
+{"Event":"SparkListenerResourceProfileAdded","Resource Profile Id":0,"Executor 
Resource Requests":{"cores":{"Resource Name":"cores","Amount":1,"Discovery 
Script":"","Vendor":""},"memory":{"Resource 
Name":"memory","Amount":2048,"Discovery 
Script":"","Vendor":""},"offHeap":{"Resource 
Name":"offHeap","Amount":0,"Discovery Script":"","Vendor":""}},"Task Resource 
Requests":{"cpus":{"Resource Name":"cpus","Amount":1.0}}}
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":587552240,"JVMOffHeapMemory":169149216,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":41075,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9117978624,"ProcessTreeJVMRSSMemory":1213
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":587552240,"JVMOffHeapMemory":169436864,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":41075,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9117978624,"ProcessTreeJVMRSSMemory":1213
 [...]
+{"Event":"SparkListenerBlockManagerAdded","Block Manager ID":{"Executor 
ID":"driver","Host":"localhost","Port":24790},"Maximum 
Memory":3676726886,"Timestamp":1782235880552,"Maximum Onheap 
Memory":3676726886,"Maximum Offheap Memory":0}
+{"Event":"SparkListenerEnvironmentUpdate","JVM Information":{"Java 
Home":"/usr/lib/jvm/java","Java Version":"17.0.5 (Microsoft)","Scala 
Version":"version 2.12.18"},"Spark Properties":{},"Hadoop 
Properties":{},"System Properties":{},"Metrics Properties":{},"Classpath 
Entries":{}}
+{"Event":"SparkListenerApplicationStart","App Name":"Spark shell","App 
ID":"local-1430917381536","Timestamp":1782235854003,"User":"spark"}
+{"Event":"org.apache.spark.scheduler.SparkListenerMiscellaneousProcessAdded","time":1782235881468,"processId":"yarn-am","info":{"hostPort":"localhost:8042","cores":1,"logUrlInfo":{"stdout":"http://localhost:8042/node/containerlogs/container_e121_1430917381536_01_000001/spark/stdout?start=-4096","stderr":"http://localhost:8042/node/containerlogs/container_e121_1430917381536_01_000001/spark/stderr?start=-4096"}}}
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":663049712,"JVMOffHeapMemory":181725520,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":4311030,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9135951872,"ProcessTreeJVMRSSMemory":12
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":663049712,"JVMOffHeapMemory":182043856,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":4311030,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9135951872,"ProcessTreeJVMRSSMemory":12
 [...]
+{"Event":"SparkListenerExecutorAdded","Timestamp":1782235902754,"Executor 
ID":"1","Executor Info":{"Host":"localhost","Total Cores":1,"Log 
Urls":{"stdout":"http://localhost:8042/node/containerlogs/container_e121_1430917381536_01_000002/spark/stdout?start=-4096","stderr":"http://localhost:8042/node/containerlogs/container_e121_1430917381536_01_000002/spark/stderr?start=-4096"},"Attributes":{"NM_HTTP_ADDRESS":"localhost:8042","USER":"spark","LOG_FILES":"stderr,stdout","NM_HTTP_PORT":"8042";
 [...]
+{"Event":"SparkListenerBlockManagerAdded","Block Manager ID":{"Executor 
ID":"1","Host":"localhost","Port":11366},"Maximum 
Memory":1099746508,"Timestamp":1782235902912,"Maximum Onheap 
Memory":1099746508,"Maximum Offheap Memory":0}
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":684021232,"JVMOffHeapMemory":183676472,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":12723107,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9146445824,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorAdded","Timestamp":1782235908831,"Executor 
ID":"3","Executor Info":{"Host":"localhost","Total Cores":1,"Log 
Urls":{"stdout":"http://localhost:8042/node/containerlogs/container_e121_1430917381536_01_000003/spark/stdout?start=-4096","stderr":"http://localhost:8042/node/containerlogs/container_e121_1430917381536_01_000003/spark/stderr?start=-4096"},"Attributes":{"NM_HTTP_ADDRESS":"localhost:8042","USER":"spark","LOG_FILES":"stderr,stdout","NM_HTTP_PORT":"8042";
 [...]
+{"Event":"SparkListenerBlockManagerAdded","Block Manager ID":{"Executor 
ID":"3","Host":"localhost","Port":11298},"Maximum 
Memory":1099746508,"Timestamp":1782235908994,"Maximum Onheap 
Memory":1099746508,"Maximum Offheap Memory":0}
+{"Event":"SparkListenerExecutorAdded","Timestamp":1782235910397,"Executor 
ID":"2","Executor Info":{"Host":"localhost","Total Cores":1,"Log 
Urls":{"stdout":"http://localhost:8042/node/containerlogs/container_e121_1430917381536_01_000004/spark/stdout?start=-4096","stderr":"http://localhost:8042/node/containerlogs/container_e121_1430917381536_01_000004/spark/stderr?start=-4096"},"Attributes":{"NM_HTTP_ADDRESS":"localhost:8042","USER":"spark","LOG_FILES":"stderr,stdout","NM_HTTP_PORT":"8042";
 [...]
+{"Event":"SparkListenerBlockManagerAdded","Block Manager ID":{"Executor 
ID":"2","Host":"localhost","Port":16966},"Maximum 
Memory":1099746508,"Timestamp":1782235910574,"Maximum Onheap 
Memory":1099746508,"Maximum Offheap Memory":0}
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":500075000,"JVMOffHeapMemory":200249712,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29547261,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9211654144,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":562989560,"JVMOffHeapMemory":207438768,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29659885,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9231601664,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":528762488,"JVMOffHeapMemory":230684216,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29659885,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9231601664,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":532956792,"JVMOffHeapMemory":230282752,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29668077,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9231601664,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":537151096,"JVMOffHeapMemory":232446888,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29668077,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9239990272,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":709117560,"JVMOffHeapMemory":244835032,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29816850,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9239990272,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":713311864,"JVMOffHeapMemory":244563024,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29816850,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9240129536,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorRemoved","Timestamp":1782235983810,"Executor 
ID":"1","Removed Reason":"Executor decommission: spark scale down"}
+{"Event":"SparkListenerBlockManagerRemoved","Block Manager ID":{"Executor 
ID":"1","Host":"localhost","Port":11366},"Timestamp":1782235983814}
+{"Event":"SparkListenerExecutorRemoved","Timestamp":1782235985799,"Executor 
ID":"1","Removed Reason":"Executor for container 
container_e121_1430917381536_01_000002 exited because of a YARN event (e.g., 
preemption) and not because of an error in the running job."}
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":793003640,"JVMOffHeapMemory":248284608,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29808921,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9248518144,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorRemoved","Timestamp":1782235989914,"Executor 
ID":"3","Removed Reason":"Executor decommission: spark scale down"}
+{"Event":"SparkListenerBlockManagerRemoved","Block Manager ID":{"Executor 
ID":"3","Host":"localhost","Port":11298},"Timestamp":1782235989915}
+{"Event":"SparkListenerExecutorRemoved","Timestamp":1782235991801,"Executor 
ID":"3","Removed Reason":"Executor for container 
container_e121_1430917381536_01_000003 exited because of a YARN event (e.g., 
preemption) and not because of an error in the running job."}
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":801392248,"JVMOffHeapMemory":249805880,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29808922,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9248518144,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":805586552,"JVMOffHeapMemory":249421632,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29800730,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9248518144,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":805586552,"JVMOffHeapMemory":249945392,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29800730,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9248518144,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":809780856,"JVMOffHeapMemory":250125488,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":29780056,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9248518144,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerJobStart","Job ID":0,"Submission 
Time":1782236034538,"Stage Infos":[{"Stage ID":0,"Stage Attempt ID":0,"Stage 
Name":"writeDataFrame at <console>:84","Number of Tasks":3,"RDD Info":[{"RDD 
ID":3,"Name":"MapPartitionsRDD","Scope":"{\"id\":\"0\",\"name\":\"WriteFiles\"}","Callsite":"writeDataFrame
 at <console>:84","Parent IDs":[2],"Storage Level":{"Use Disk":false,"Use 
Memory":false,"Use Off 
Heap":false,"Deserialized":false,"Replication":1},"Barrier":false,"Determinist 
[...]
+{"Event":"SparkListenerStageSubmitted","Stage Info":{"Stage ID":0,"Stage 
Attempt ID":0,"Stage Name":"writeDataFrame at <console>:84","Number of 
Tasks":3,"RDD Info":[{"RDD 
ID":3,"Name":"MapPartitionsRDD","Scope":"{\"id\":\"0\",\"name\":\"WriteFiles\"}","Callsite":"writeDataFrame
 at <console>:84","Parent IDs":[2],"Storage Level":{"Use Disk":false,"Use 
Memory":false,"Use Off 
Heap":false,"Deserialized":false,"Replication":1},"Barrier":false,"DeterministicLevel":"DETERMINATE","Number
 of Parti [...]
+{"Event":"SparkListenerTaskStart","Stage ID":0,"Stage Attempt ID":0,"Task 
Info":{"Task ID":0,"Index":0,"Attempt":0,"Partition ID":0,"Launch 
Time":1782236034680,"Executor 
ID":"2","Host":"localhost","Locality":"PROCESS_LOCAL","Speculative":false,"Getting
 Result Time":0,"Finish Time":0,"Failed":false,"Killed":false,"Resource Profile 
ID":0,"Accumulables":[]}}
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":673064904,"JVMOffHeapMemory":281199496,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":733937,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":733937,"OffHeapUnifiedMemory":0,"DirectPoolMemory":33969867,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9349148672,"ProcessTreeJVMRS
 [...]
+{"Event":"SparkListenerTaskStart","Stage ID":0,"Stage Attempt ID":0,"Task 
Info":{"Task ID":1,"Index":1,"Attempt":0,"Partition ID":1,"Launch 
Time":1782236037542,"Executor 
ID":"2","Host":"localhost","Locality":"PROCESS_LOCAL","Speculative":false,"Getting
 Result Time":0,"Finish Time":0,"Failed":false,"Killed":false,"Resource Profile 
ID":0,"Accumulables":[]}}
+{"Event":"SparkListenerTaskEnd","Stage ID":0,"Stage Attempt ID":0,"Task 
Type":"ResultTask","Task End Reason":{"Reason":"Success"},"Task Info":{"Task 
ID":0,"Index":0,"Attempt":0,"Partition ID":0,"Launch 
Time":1782236034680,"Executor 
ID":"2","Host":"localhost","Locality":"PROCESS_LOCAL","Speculative":false,"Getting
 Result Time":0,"Finish 
Time":1782236037555,"Failed":false,"Killed":false,"Resource Profile 
ID":0,"Accumulables":[{"ID":4,"Name":"task commit 
time","Update":"50","Value":"50","In [...]
+{"Event":"SparkListenerTaskStart","Stage ID":0,"Stage Attempt ID":0,"Task 
Info":{"Task ID":2,"Index":2,"Attempt":0,"Partition ID":2,"Launch 
Time":1782236037693,"Executor 
ID":"2","Host":"localhost","Locality":"PROCESS_LOCAL","Speculative":false,"Getting
 Result Time":0,"Finish Time":0,"Failed":false,"Killed":false,"Resource Profile 
ID":0,"Accumulables":[]}}
+{"Event":"SparkListenerTaskEnd","Stage ID":0,"Stage Attempt ID":0,"Task 
Type":"ResultTask","Task End Reason":{"Reason":"Success"},"Task Info":{"Task 
ID":1,"Index":1,"Attempt":0,"Partition ID":1,"Launch 
Time":1782236037542,"Executor 
ID":"2","Host":"localhost","Locality":"PROCESS_LOCAL","Speculative":false,"Getting
 Result Time":0,"Finish 
Time":1782236037694,"Failed":false,"Killed":false,"Resource Profile 
ID":0,"Accumulables":[{"ID":4,"Name":"task commit 
time","Update":"37","Value":"87","In [...]
+{"Event":"SparkListenerTaskEnd","Stage ID":0,"Stage Attempt ID":0,"Task 
Type":"ResultTask","Task End Reason":{"Reason":"Success"},"Task Info":{"Task 
ID":2,"Index":2,"Attempt":0,"Partition ID":2,"Launch 
Time":1782236037693,"Executor 
ID":"2","Host":"localhost","Locality":"PROCESS_LOCAL","Speculative":false,"Getting
 Result Time":0,"Finish 
Time":1782236037801,"Failed":false,"Killed":false,"Resource Profile 
ID":0,"Accumulables":[{"ID":4,"Name":"task commit 
time","Update":"40","Value":"127","I [...]
+{"Event":"SparkListenerStageExecutorMetrics","Executor ID":"2","Stage 
ID":0,"Stage Attempt ID":0,"Executor 
Metrics":{"JVMHeapMemory":186850048,"JVMOffHeapMemory":116149944,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":733937,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":733937,"OffHeapUnifiedMemory":0,"DirectPoolMemory":16807195,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":4315377664,"ProcessTreeJVMRSSMemory":628396032,"ProcessTreePythonVMemory":0,"ProcessTr
 [...]
+{"Event":"SparkListenerStageExecutorMetrics","Executor ID":"driver","Stage 
ID":0,"Stage Attempt ID":0,"Executor 
Metrics":{"JVMHeapMemory":673064904,"JVMOffHeapMemory":281199496,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":733937,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":733937,"OffHeapUnifiedMemory":0,"DirectPoolMemory":33969867,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9349148672,"ProcessTreeJVMRSSMemory":1489293312,"ProcessTreePythonVMemory":0,"Pro
 [...]
+{"Event":"SparkListenerStageCompleted","Stage Info":{"Stage ID":0,"Stage 
Attempt ID":0,"Stage Name":"writeDataFrame at <console>:84","Number of 
Tasks":3,"RDD Info":[{"RDD 
ID":3,"Name":"MapPartitionsRDD","Scope":"{\"id\":\"0\",\"name\":\"WriteFiles\"}","Callsite":"writeDataFrame
 at <console>:84","Parent IDs":[2],"Storage Level":{"Use Disk":false,"Use 
Memory":false,"Use Off 
Heap":false,"Deserialized":false,"Replication":1},"Barrier":false,"DeterministicLevel":"DETERMINATE","Number
 of Parti [...]
+{"Event":"SparkListenerJobEnd","Job ID":0,"Completion Time":1782236037805,"Job 
Result":{"Result":"JobSucceeded"}}
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":798894024,"JVMOffHeapMemory":302532712,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":733937,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":733937,"OffHeapUnifiedMemory":0,"DirectPoolMemory":33973602,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9373675520,"ProcessTreeJVMRS
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":807282632,"JVMOffHeapMemory":304663000,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":733937,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":733937,"OffHeapUnifiedMemory":0,"DirectPoolMemory":33991159,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9373675520,"ProcessTreeJVMRS
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":811476936,"JVMOffHeapMemory":306466816,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":733937,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":733937,"OffHeapUnifiedMemory":0,"DirectPoolMemory":33999351,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9373675520,"ProcessTreeJVMRS
 [...]
+{"Event":"SparkListenerExecutorMetricsUpdate","Executor ID":"driver","Metrics 
Updated":[],"Executor Metrics Updated":[{"Stage ID":-1,"Stage Attempt 
ID":-1,"Executor 
Metrics":{"JVMHeapMemory":542426624,"JVMOffHeapMemory":305486288,"OnHeapExecutionMemory":0,"OffHeapExecutionMemory":0,"OnHeapStorageMemory":0,"OffHeapStorageMemory":0,"OnHeapUnifiedMemory":0,"OffHeapUnifiedMemory":0,"DirectPoolMemory":33999351,"MappedPoolMemory":0,"ProcessTreeJVMVMemory":9391607808,"ProcessTreeJVMRSSMemory":1
 [...]
+{"Event":"SparkListenerApplicationEnd","Timestamp":1782236075148,"ExitCode":1}
diff --git 
a/core/src/test/scala/org/apache/spark/deploy/history/FsHistoryProviderSuite.scala
 
b/core/src/test/scala/org/apache/spark/deploy/history/FsHistoryProviderSuite.scala
index 16f9a4300db0..873431d7942e 100644
--- 
a/core/src/test/scala/org/apache/spark/deploy/history/FsHistoryProviderSuite.scala
+++ 
b/core/src/test/scala/org/apache/spark/deploy/history/FsHistoryProviderSuite.scala
@@ -121,7 +121,7 @@ abstract class FsHistoryProviderSuite extends SparkFunSuite 
with Matchers with P
     writeFile(newAppComplete, None,
       SparkListenerApplicationStart(newAppComplete.getName(), 
Some("new-app-complete"), 1L, "test",
         None),
-      SparkListenerApplicationEnd(5L)
+      SparkListenerApplicationEnd(5L, Some(1))
       )
 
     // Write a new-style application log.
@@ -153,7 +153,8 @@ abstract class FsHistoryProviderSuite extends SparkFunSuite 
with Matchers with P
           end: Long,
           lastMod: Long,
           user: String,
-          completed: Boolean): ApplicationInfo = {
+          completed: Boolean,
+          exitCode: Option[Int] = None): ApplicationInfo = {
 
         val duration = if (end > 0) end - start else 0
         // Get log dir info from the provider
@@ -161,13 +162,13 @@ abstract class FsHistoryProviderSuite extends 
SparkFunSuite with Matchers with P
         val (logSourceName, logSourceFullPath) = 
provider.getLogDirInfo(logPath)
         new ApplicationInfo(id, name, None, None, None, None,
           List(ApplicationAttemptInfo(None, new Date(start),
-            new Date(end), new Date(lastMod), duration, user, completed, 
SPARK_VERSION,
+            new Date(end), new Date(lastMod), duration, user, completed, 
SPARK_VERSION, exitCode,
             Some(logSourceName), Some(logSourceFullPath))))
       }
 
       // For completed files, lastUpdated would be lastModified time.
       list(0) should be (makeAppInfo("new-app-complete", 
newAppComplete.getName(), 1L, 5L,
-        newAppComplete.lastModified(), "test", true))
+        newAppComplete.lastModified(), "test", true, Some(1)))
       list(1) should be (makeAppInfo("new-complete-lzf", 
newAppCompressedComplete.getName(),
         1L, 4L, newAppCompressedComplete.lastModified(), "test", true))
 
diff --git 
a/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala 
b/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
index 13432b6ed9fc..79e0001fa22f 100644
--- 
a/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
+++ 
b/core/src/test/scala/org/apache/spark/deploy/history/HistoryServerSuite.scala
@@ -140,6 +140,7 @@ abstract class HistoryServerSuite extends SparkFunSuite 
with BeforeAndAfter with
     "limit app list json" -> "applications?limit=3",
     "one app json" -> "applications/local-1422981780767",
     "one app multi-attempt json" -> "applications/local-1426533911241",
+    "one app with non-zero exit code json" -> 
"applications/local-1430917381536",
     "job list json" -> "applications/local-1422981780767/jobs",
     "job list from multi-attempt app json(1)" -> 
"applications/local-1426533911241/1/jobs",
     "job list from multi-attempt app json(2)" -> 
"applications/local-1426533911241/2/jobs",
diff --git 
a/core/src/test/scala/org/apache/spark/status/AppStatusListenerSuite.scala 
b/core/src/test/scala/org/apache/spark/status/AppStatusListenerSuite.scala
index 4d75f5d7a1fc..bbcc245b2ee4 100644
--- a/core/src/test/scala/org/apache/spark/status/AppStatusListenerSuite.scala
+++ b/core/src/test/scala/org/apache/spark/status/AppStatusListenerSuite.scala
@@ -134,6 +134,7 @@ abstract class AppStatusListenerSuite extends SparkFunSuite 
with BeforeAndAfter
       assert(attempt.endTime.getTime() === -1L)
       assert(attempt.sparkUser === "user")
       assert(!attempt.completed)
+      assert(attempt.exitCode === None)
       assert(attempt.appSparkVersion === "TestSparkVersion")
     }
 
@@ -691,7 +692,7 @@ abstract class AppStatusListenerSuite extends SparkFunSuite 
with BeforeAndAfter
     }
 
     // End the application.
-    listener.onApplicationEnd(SparkListenerApplicationEnd(42L))
+    listener.onApplicationEnd(SparkListenerApplicationEnd(42L, Some(1)))
 
     check[ApplicationInfoWrapper]("id") { app =>
       assert(app.info.name === "name")
@@ -706,6 +707,7 @@ abstract class AppStatusListenerSuite extends SparkFunSuite 
with BeforeAndAfter
       assert(attempt.duration === 41L)
       assert(attempt.sparkUser === "user")
       assert(attempt.completed)
+      assert(attempt.exitCode === Some(1))
     }
   }
 
diff --git 
a/core/src/test/scala/org/apache/spark/status/protobuf/KVStoreProtobufSerializerSuite.scala
 
b/core/src/test/scala/org/apache/spark/status/protobuf/KVStoreProtobufSerializerSuite.scala
index ac568fee1ad4..68e302628bc4 100644
--- 
a/core/src/test/scala/org/apache/spark/status/protobuf/KVStoreProtobufSerializerSuite.scala
+++ 
b/core/src/test/scala/org/apache/spark/status/protobuf/KVStoreProtobufSerializerSuite.scala
@@ -395,7 +395,8 @@ class KVStoreProtobufSerializerSuite extends SparkFunSuite {
         duration = 100,
         sparkUser = null,
         completed = true,
-        appSparkVersion = null
+        appSparkVersion = null,
+        exitCode = Some(1)
       ))
     val input = new ApplicationInfoWrapper(
       ApplicationInfo(
diff --git a/dev/.rat-excludes b/dev/.rat-excludes
index a61fe35f2729..81f05cd01175 100644
--- a/dev/.rat-excludes
+++ b/dev/.rat-excludes
@@ -84,6 +84,7 @@ local-1426633911242
 local-1430917381534
 local-1430917381535_1
 local-1430917381535_2
+local-1430917381536
 local-1642039451826
 eventlog_v2_local-1766844910796
 DESCRIPTION
diff --git a/project/MimaExcludes.scala b/project/MimaExcludes.scala
index ec962eb173b6..df2b51f3b732 100644
--- a/project/MimaExcludes.scala
+++ b/project/MimaExcludes.scala
@@ -41,6 +41,9 @@ object MimaExcludes {
 
   // Exclude rules for 4.2.x from 4.1.0
   lazy val v42excludes = v41excludes ++ Seq(
+    // [SPARK-54879] Add exitCode field to ApplicationAttemptInfo
+    
ProblemFilters.exclude[DirectMissingMethodProblem]("org.apache.spark.status.api.v1.ApplicationAttemptInfo.tupled"),
+    
ProblemFilters.exclude[DirectMissingMethodProblem]("org.apache.spark.status.api.v1.ApplicationAttemptInfo.curried"),
     // [SQL] SafeJsonSerializer.safeMapToJValue: second parameter widened from 
Function1 to
     // Function2 so the key is passed to the value serializer 
(progress.scala). Binary-incompatible
     // vs spark-sql-api 4.0.0; not part of the public supported API 
(private[streaming] package).


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to