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

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 00b1568f452 Restructure spark durable execution docs for all cluster 
managers (#72325)
00b1568f452 is described below

commit 00b1568f452fb14e82084690fdb449089de7eba5
Author: Amogh Desai <[email protected]>
AuthorDate: Tue Sep 8 16:48:52 2026 -0500

    Restructure spark durable execution docs for all cluster managers (#72325)
---
 providers/apache/spark/docs/operators.rst | 90 +++++++++++++++++++------------
 1 file changed, 56 insertions(+), 34 deletions(-)

diff --git a/providers/apache/spark/docs/operators.rst 
b/providers/apache/spark/docs/operators.rst
index 6da0e87fce6..92792a26725 100644
--- a/providers/apache/spark/docs/operators.rst
+++ b/providers/apache/spark/docs/operators.rst
@@ -182,37 +182,41 @@ Reference
 
 For further information, look at `Apache Spark submitting applications 
<https://spark.apache.org/docs/latest/submitting-applications.html>`_.
 
-Cluster mode crash recovery (Spark standalone)
-"""""""""""""""""""""""""""""""""""""""""""""""
+Durable execution (crash recovery)
+""""""""""""""""""""""""""""""""""
 
-When running in Spark standalone cluster mode (``--deploy-mode cluster``), the 
Spark driver runs
-independently on the cluster. If the Airflow worker dies while the Spark job 
is running, the driver keeps running but
-Airflow loses track of it and the behaviour to submit a brand new job would be 
wasting
-the compute already done or even cause conflicts if the Spark job itself is 
not designed to be idempotent.
+In cluster deploy mode (``--deploy-mode cluster``) the Spark driver runs 
independently of the
+Airflow worker. If the worker dies while the Spark job is running, the driver 
keeps running but
+Airflow loses track of it, and submitting a brand new job on retry wastes the 
compute already done,
+or even causes conflicts if the Spark job itself is not designed to be 
idempotent.
 
-Now, the ``SparkSubmitOperator`` solves this by persisting the driver ID to 
:doc:`task state store
+The ``SparkSubmitOperator`` solves this by persisting the driver identifier to 
:doc:`task state store
 <apache-airflow:core-concepts/task-state-store>` immediately after submission. 
On retry, it reads
-the ID back and reconnects to the already-running driver instead of 
resubmitting.
+the identifier back and reconnects to the already-running driver instead of 
resubmitting.
 
 This is the **synchronous path** — the worker holds a slot for the duration of 
polling. This is
 a crash-safety net for teams running sync operators for log observability, org 
constraints, or
 because a Triggerer is not available. Teams with a Triggerer available may 
also consider
 deferrable operators, which free the worker slot but may come with added 
complexity.
 
-**Connection requirements for crash recovery**
+``durable`` defaults to ``True`` and every cluster manager supports it. What 
differs is the
+prerequisite each one needs before the operator can check driver status on 
retry:
 
-The reconnection polling calls the Spark standalone REST API
-(``GET /v1/submissions/status/{driverId}``). Make sure the Spark connection's
-``REST scheme`` and ``REST port`` extras match your cluster's configuration:
-
-* ``REST scheme`` — set to ``https`` if your cluster has TLS enabled on the 
REST port
-  (``spark.ssl.standalone.enabled=true``). Defaults to ``http``.
-* ``REST port`` — set to the value of ``spark.master.rest.port`` on your 
cluster. Defaults to ``6066``.
+.. list-table::
+   :header-rows: 1
+   :widths: 30 70
 
-See :doc:`connections/spark-submit` for how to configure these fields.
+   * - Cluster manager
+     - Prerequisite for ``durable=True``
+   * - `Spark standalone`_
+     - ``REST scheme`` and ``REST port`` connection extras
+   * - `Kubernetes cluster mode`_
+     - ``track_driver_via_k8s_api=True``
+   * - `YARN cluster mode`_
+     - ``yarn_track_via_rm_api=True`` and 
``yarn_resourcemanager_webapp_address``
 
 .. note::
-    Crash recovery in cluster mode requires Airflow 3.3+ (``task_state_store`` 
support). Below
+    Durable execution requires Airflow 3.3+ (``task_state_store`` support). 
Below
     3.3, ``durable`` has no effect: setting it explicitly only emits a 
warning, and the operator
     always submits fresh, exactly as before this feature existed. The 
deprecated
     ``reconnect_on_retry`` parameter (the original name for this same feature, 
superseded almost
@@ -229,8 +233,25 @@ This is most reliable for deferred tasks 
(``deferrable=True``); clearing a task
 polling synchronously can cancel the driver via ``on_kill`` before the next 
attempt gets a chance
 to reconnect -- see :doc:`apache-airflow:core-concepts/resumable-tasks` for 
why.
 
-Tracking driver status via Kubernetes API
-""""""""""""""""""""""""""""""""""""""""""
+.. _cluster-mode-crash-recovery-spark-standalone:
+
+Spark standalone
+""""""""""""""""
+
+Reconnecting to a running driver calls the Spark standalone REST API
+(``GET /v1/submissions/status/{driverId}``). Make sure the Spark connection's
+``REST scheme`` and ``REST port`` extras match your cluster's configuration:
+
+* ``REST scheme`` — set to ``https`` if your cluster has TLS enabled on the 
REST port
+  (``spark.ssl.standalone.enabled=true``). Defaults to ``http``.
+* ``REST port`` — set to the value of ``spark.master.rest.port`` on your 
cluster. Defaults to ``6066``.
+
+See :doc:`connections/spark-submit` for how to configure these fields.
+
+.. _tracking-driver-status-via-kubernetes-api:
+
+Kubernetes cluster mode
+"""""""""""""""""""""""
 
 When running in Kubernetes cluster mode, ``spark-submit`` blocks for the 
duration of the job.
 The JVM runs processes which does nothing but polling of the pod phase and 
holds heap space for
@@ -238,7 +259,10 @@ the entire duration. This is not ideal for long-running 
jobs, especially when th
 for long periods (e.g. waiting for data or user input).
 
 Set ``track_driver_via_k8s_api=True`` to have the operator track the driver 
pod status via the
-Python Kubernetes client rather than holding ``spark-submit`` open for the 
full job duration:
+Python Kubernetes client rather than holding ``spark-submit`` open for the 
full job duration. The
+same flag is what lets the operator find the driver again after a crash, so it 
is also the
+prerequisite for durable execution on Kubernetes: the driver pod name is 
persisted to task state
+before polling begins, and a retry reconnects to that pod instead of 
submitting a fresh one.
 
 .. code-block:: python
 
@@ -260,17 +284,17 @@ Python Kubernetes client rather than holding 
``spark-submit`` open for the full
   conflicts with the flag and a ``ValueError`` will be raised at task start.
 * The Airflow worker must be able to reach the Kubernetes API server and have 
permission to
   read and delete pods in the driver's namespace; otherwise pod tracking and 
cleanup will fail.
-* Set ``durable=True`` (the default) to enable crash recovery: the driver pod 
name is
-  persisted to task state before polling begins, so a worker crash and retry 
reconnects to the
-  existing pod instead of submitting a fresh one. Set ``durable=False`` to 
always
-  submit a fresh driver on retry.
 * Pod completion is detected from ``pod.status.phase``. If your driver pods 
have sidecar
   containers (e.g. Istio injection enabled for the driver namespace), the pod 
phase may not
   advance to ``Succeeded`` until all sidecars exit. In that case the poll loop 
will wait
   indefinitely — set ``execution_timeout`` as a hard bound.
 
-YARN ResourceManager API tracking
-"""""""""""""""""""""""""""""""""
+Set ``durable=False`` to always submit a fresh driver on retry.
+
+.. _yarn-resourcemanager-api-tracking:
+
+YARN cluster mode
+"""""""""""""""""
 
 When running Spark applications on YARN in cluster deploy mode, the default 
Spark submit path keeps
 the local ``spark-submit`` JVM alive on the Airflow worker while the YARN
@@ -282,6 +306,11 @@ application, then poll the YARN ResourceManager REST API 
until the application r
 state. The ResourceManager API polling interval is controlled by 
``status_poll_interval`` with a
 minimum of 10 seconds.
 
+The ResourceManager REST API is also what makes checking application status on 
retry possible, so
+this flag is the prerequisite for durable execution on YARN. Because 
``durable`` defaults to
+``True``, leaving the flag unset raises a ``ValueError`` at task start rather 
than silently falling
+back to a fire-and-forget submission.
+
 This mode requires the Spark connection extra to set 
``yarn_resourcemanager_webapp_address`` before
 the application is submitted:
 
@@ -306,13 +335,6 @@ the application is submitted:
         yarn_track_via_rm_api=True,
     )
 
-On Airflow 3.3+, YARN cluster mode with ``durable=True`` (the default) requires
-``yarn_track_via_rm_api=True`` -- the ResourceManager REST API is what makes 
checking application
-status on retry possible. Without it, the operator raises a ``ValueError`` at 
task start rather
-than silently falling back to a fire-and-forget submission. Below 3.3, 
``durable`` has no effect
-at all, so this requirement doesn't apply there either: durable execution 
isn't active to have a
-prerequisite for.
-
 For Kerberized clusters, install ``requests-kerberos`` in the Airflow 
environment. When the
 Spark connection has both ``keytab`` and ``principal`` configured, Airflow 
automatically uses
 ``HTTPKerberosAuth()`` for the ResourceManager REST requests.

Reply via email to