Spark Join策略详解与优化
请详细说明Spark支持的Join类型(SortMergeJoin/BroadcastHashJoin/ShuffledHashJoin)及其选择策略,如何手动指定Join方式?
回答
我还是少年
Spark 3种Join策略:
1. Broadcast Hash Join(BHJ):
- 条件:小表<
spark.sql.autoBroadcastJoinThreshold(默认10MB) - 流程:小表收集到Driver→广播到所有Executor→每个Executor本地Hash Join
- 优点:无Shuffle,最快
- 限制:小表必须能放进Driver和执行器内存
- 手动指定:
/*+ BROADCAST(t) */
2. Shuffled Hash Join(SHJ):
- 条件:
spark.sql.join.preferSortMergeJoin=false(Spark 2.x后默认SortMergeJoin) - 流程:两表按Join Key Shuffle→每个分区用Hash Table Join
- 优点:不需要排序
- 缺点:需要构建Hash Table,大表可能OOM
- 当前默认不使用
3. Sort Merge Join(SMJ):
- 条件:两表数据量大,无法广播
- 流程:两表按Join Key Shuffle→各自排序→归并匹配
- 优点:稳定,适合大数据量
- 缺点:需要排序和Shuffle
- 手动指定:
/*+ MERGE(t) */或设置spark.sql.join.preferSortMergeJoin=true
Spark 3.0+ AQE优化:
spark.sql.adaptive.coalescePartitions.enabled自动合并小分区spark.sql.adaptive.skewJoin.enabled自动检测倾斜Join并拆分spark.sql.adaptive.localShuffleReader.enabled小表转换为Broadcast Join
选择策略(优化器CBO):
- 收集表统计信息:
ANALYZE TABLE ... COMPUTE STATISTICS - 启用CBO:
spark.sql.cbo.enabled=true