How anirudha03/spark-redis works
Purpose and runtime
Spark-Redis is a Scala connector library that exposes Redis to Apache Spark 3.2.x / Scala 2.12 workloads. It supports Redis standalone and cluster deployments, mapping Redis data structures to Spark RDDs, DataFrames/Spark SQL, DStreams, and Structured Streaming. Build metadata is in pom.xml and project/build.properties.
Public integration entry points
Spark applications enter through implicit/function APIs for RDD and DStream use, plus Spark SQL data-source registration and provider classes:
• RDD APIs: src/main/scala/com/redislabs/provider/redis/redisFunctions.scala, src/main/scala/com/redislabs/provider/redis/rdd/RedisRDD.scala
• DStreams: src/main/scala/com/redislabs/provider/redis/streaming/redisStreamingFunctions.scala, src/main/scala/com/redislabs/provider/redis/streaming/RedisInputDStream.scala
• SQL DataSource V1 registration/provider: src/main/scala/org/apache/spark/sql/redis/DefaultSource.scala, src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister
• Structured Streaming provider: src/main/scala/org/apache/spark/sql/redis/stream/RedisStreamProvider.scala, src/main/scala/org/apache/spark/sql/redis/stream/RedisSource.scala
Connection, configuration, and cluster boundary
RedisConfig centralizes connector options, while ConnectionPool owns reusable Redis connectivity. Connection utilities form the boundary between Spark executors and Redis, including cluster-aware routing/behavior; this boundary must tolerate topology changes described by the connector contract.
• src/main/scala/com/redislabs/provider/redis/RedisConfig.scala
• src/main/scala/com/redislabs/provider/redis/ConnectionPool.scala
• src/main/scala/com/redislabs/provider/redis/util/ConnectionUtils.scala
RDD read/write execution
RedisRDD represents Redis-backed Spark partitions. RedisPartitioner and RedisPartition translate Redis keyspace/cluster distribution into Spark task partitions, so executor tasks can operate near Redis’s slot/node layout. RDD operations flow from Spark transformations/actions through partition-specific Redis reads or writes, using pooled connections.
• src/main/scala/com/redislabs/provider/redis/rdd/RedisRDD.scala
• src/main/scala/com/redislabs/provider/redis/partitioner/RedisPartitioner.scala
• src/main/scala/com/redislabs/provider/redis/partitioner/RedisPartition.scala
Batch SQL/DataFrame persistence
The SQL connector translates DataFrame schemas and rows into Redis persistence models, then exposes reads as a Spark relation. DefaultSource selects relation behavior; RedisSourceRelation handles Spark SQL relation interaction; persistence implementations encode either binary values or Redis hashes.
• src/main/scala/org/apache/spark/sql/redis/DefaultSource.scala
• src/main/scala/org/apache/spark/sql/redis/RedisSourceRelation.scala
• src/main/scala/org/apache/spark/sql/redis/RedisPersistence.scala
• src/main/scala/org/apache/spark/sql/redis/BinaryRedisPersistence.scala
• src/main/scala/org/apache/spark/sql/redis/HashRedisPersistence.scala
Streaming ingestion
Legacy Spark Streaming uses a receiver-backed DStream to pull Redis stream data into micro-batches. Structured Streaming separates source configuration, offsets, reader/RDD creation, and provider integration; offset state is the key control boundary for incremental, restartable processing.
• src/main/scala/com/redislabs/provider/redis/streaming/RedisStreamReceiver.scala
• src/main/scala/org/apache/spark/sql/redis/stream/RedisSourceConfig.scala
• src/main/scala/org/apache/spark/sql/redis/stream/RedisSourceOffset.scala
• src/main/scala/org/apache/spark/sql/redis/stream/RedisStreamReader.scala
• src/main/scala/org/apache/spark/sql/redis/stream/RedisSourceRdd.scala
Operational infrastructure
The artifact is built with Maven/SBT-oriented project files and released through GitHub Actions. Integration CI is defined in .github/workflows/integration.yml; release automation is in .github/workflows/version-and-release.yml. Redis is the external datastore/service, and Spark driver/executors are the consuming runtime.
Main entry points: ConnectionPool.scala Cluster-aware connections · RedisSource.scala Structured Redis source · RedisRDD.scala RedisRDD · RedisSourceRelation.scala RedisSourceRelation
Components 20
Spark integration
- RDD functions
src/main/scala/com/redislabs/provider/redis/redisFunctions.scala - DStream functions
src/main/scala/com/redislabs/provider/redis/streaming/redisStreamingFunctions.scala
Connector execution
- RedisRDD · Redis-backed partitioned read/write execution.
src/main/scala/com/redislabs/provider/redis/rdd/RedisRDD.scala - RedisConfig
src/main/scala/com/redislabs/provider/redis/RedisConfig.scala - Redis partition mapping · Maps keyspace and cluster distribution to Spark task partitions.
src/main/scala/com/redislabs/provider/redis/partitioner/RedisPartitioner.scala - Cluster-aware connections · Pools executor connections and handles cluster-aware routing.
src/main/scala/com/redislabs/provider/redis/ConnectionPool.scala
Spark SQL
- SQL DefaultSource · Registered through the Spark SQL service entry.
src/main/scala/org/apache/spark/sql/redis/DefaultSource.scala - RedisSourceRelation · Executes batch DataFrame reads and writes.
src/main/scala/org/apache/spark/sql/redis/RedisSourceRelation.scala - Redis persistence models · Binary and hash persistence implementations encode DataFrame rows.
src/main/scala/org/apache/spark/sql/redis/RedisPersistence.scala
Streaming
- Redis input DStream · Builds receiver-backed micro-batches.
src/main/scala/com/redislabs/provider/redis/streaming/RedisInputDStream.scala - Redis stream receiver
src/main/scala/com/redislabs/provider/redis/streaming/RedisStreamReceiver.scala - Structured stream provider
src/main/scala/org/apache/spark/sql/redis/stream/RedisStreamProvider.scala - Structured Redis source · Coordinates incremental source execution.
src/main/scala/org/apache/spark/sql/redis/stream/RedisSource.scala - Source config
src/main/scala/org/apache/spark/sql/redis/stream/RedisSourceConfig.scala - Source offsets · Controls restartable incremental reads.
src/main/scala/org/apache/spark/sql/redis/stream/RedisSourceOffset.scala - Stream reader · Creates stream read work.
src/main/scala/org/apache/spark/sql/redis/stream/RedisStreamReader.scala - Redis source RDD
src/main/scala/org/apache/spark/sql/redis/stream/RedisSourceRdd.scala
Build & delivery
- Build & release automation · Maven/SBT project metadata and GitHub Actions integration and release workflows.
pom.xml
Other components
- Spark driver & executors · Consumer runtime for connector APIs and task execution.
- Redis standalone / cluster · Target datastore with cluster topology changes.
Connections 23
- Spark driver & executors → RDD functions: uses
- RDD functions → RedisRDD: creates
- RedisRDD → Redis partition mapping: plans tasks
- Redis partition mapping → Cluster-aware connections: routes partitions
- RedisRDD → Cluster-aware connections: reads / writes
- Spark driver & executors → DStream functions: uses
- DStream functions → Redis input DStream: creates
- Redis input DStream → Redis stream receiver: runs
- Redis stream receiver → Cluster-aware connections: consumes
- Spark driver & executors → SQL DefaultSource: loads SQL source
- SQL DefaultSource → RedisSourceRelation: selects relation
- RedisSourceRelation → Redis persistence models: encodes rows
- RedisSourceRelation → Cluster-aware connections: reads / writes
- Spark driver & executors → Structured stream provider: loads stream source
- Structured stream provider → Structured Redis source: creates
- Structured Redis source → Source config: uses
- Structured Redis source → Source offsets: tracks progress
- Structured Redis source → Stream reader: plans batches
- Stream reader → Redis source RDD: creates
- Redis source RDD → Cluster-aware connections: reads
- RedisConfig → Cluster-aware connections: configures
- Cluster-aware connections → Redis standalone / cluster: pooled cluster-aware access
- Build & release automation → Spark driver & executors: publishes connector artifact