You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@spark.apache.org by "Yu Gan (Jira)" <ji...@apache.org> on 2026/06/16 08:54:00 UTC
[jira] [Created] (SPARK-57487) Support distributed map join for medium-sized build tables via SQL hint
Yu Gan created SPARK-57487:
------------------------------
Summary: Support distributed map join for medium-sized build tables via SQL hint
Key: SPARK-57487
URL: https://issues.apache.org/jira/browse/SPARK-57487
Project: Spark
Issue Type: New Feature
Components: SQL
Affects Versions: 5.0.0
Reporter: Yu Gan
Broadcast hash join is limited by driver memory and executor broadcast threshold — tables between ~200MB and 2GB often fall back to expensive shuffle joins, causing unnecessary data movement on the probe side.
This PR introduces *Distributed Map Join (DMJ)*, a new join strategy that avoids full shuffle by:
1. Hash-partitioning the build side into a fixed number of shards across executors
2. Building a HashedRelation per shard with replica placement for fault tolerance
3. Probe side performs batched RPC lookups (with bloom filter pre-filtering) instead of shuffling
The strategy is triggered explicitly via SQL hint:
\{code}
SELECT /*+ DISTMAPJOIN(build_table(shard_count=5, replica_count=3)) */ ...
FROM probe_table JOIN build_table ON ...
\{code}
h3. Production benchmark
A LEFT JOIN workload in our production environment (16k cores, 120TB memory):
- Probe side: ~5PB
- Build side: ~2GB
- Before (shuffle hash join): probe-side shuffle write + join stages took *~5 hours*
- After (distributed map join): single probe-side join stage took *~2 hours*
- *~60% wall-time reduction* by eliminating the probe-side shuffle entirely
h3. Supported join types
Inner, LeftOuter, RightOuter, LeftSemi, LeftAnti, ExistenceJoin.
h3. Key components
- *ShardManager / ShardManagerMaster* (core): manages shard lifecycle, location tracking, and replica placement
- *ShardExchangeExec*: physical exchange operator that partitions build side into shards
- *DistributedMapJoinExec*: physical join operator with async batched RPC lookups
- *ShardLookupService*: Netty-based RPC layer for shard data transfer (pluggable via \{{spark.shard.service}})
- Full AQE integration via ShardQueryStageExec
This is similar in spirit to Hive's map join but distributed — no single-node bottleneck.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@spark.apache.org
For additional commands, e-mail: issues-help@spark.apache.org