Acceldata
ODP

Structured Streaming

Real-Time Mode (RTM)

Spark 4.1.1 introduces the first official support for Real-Time Mode in Structured Streaming, enabling continuous sub-second latency processing. For stateless workloads, p99 latencies can reach single-digit milliseconds.

Activation — no code changes required, just configuration:

query = df.writeStream \
 .format("kafka") \
 .option("kafka.bootstrap.servers", "localhost:9092") \
 .option("topic", "output-topic") \
 .option("checkpointLocation", "/checkpoint") \
 .trigger(continuous="1 second") \  # enables Real-Time Mode
 .start()

Spark 4.1.1 RTM support matrix:

Dimension

Supported in 4.1.1

Query types

Stateless, single-stage

Language

Scala

Sources

Kafka

Sinks

Kafka, Foreach

Operators

Stateless ops, Unions, Broadcast Stream-Static Joins

Output mode

Update

Target latency

Sub-second (p99 single-digit ms for stateless)


Arbitrary Stateful Processing V2

Enhances Structured Streaming with flexible custom stateful operations. Supports complex event processing, stateful ML models, and a State Data Source for reading key-value pairs from checkpoints — useful for debugging and testing streaming pipelines.

Example:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col
from pyspark.sql.streaming import GroupStateTimeout
 
spark = SparkSession.builder.appName("Stateful Processing V2").getOrCreate()
 
streaming_df = spark.readStream \
 .format("socket") \
 .option("host", "localhost") \
 .option("port", 9999) \
 .load()
 
def update_state(new_values, state):
 if state.isTimeout():
 return None
 total = sum(new_values) + (state.get() or 0)
 state.update(total)
 return total
 
query = streaming_df \
 .groupBy("key") \
 .mapGroupsWithState(update_state, GroupStateTimeout.NoTimeout()) \
 .writeStream \
 .format("console") \
 .outputMode("update") \
 .start()
 
query.awaitTermination()