【问题标题】:Why does Spark Planner prefer sort merge join over shuffled hash join?为什么 Spark Planner 更喜欢排序合并连接而不是随机哈希连接?
【发布时间】:2018-10-05 18:20:39
【问题描述】:

为什么 Spark 2.3 中的 Spark Planner 更喜欢排序合并连接而不是随机散列连接?换句话说,为什么spark.sql.join.preferSortMergeJoin是配置属性internal and turned on by default?洗牌哈希连接有什么问题?这是 Spark 特有的,它以分布式方式进行计算还是连接算法中更固有的其他方式?

您可以找到在JoinSelection 执行计划策略herehere 中使用的属性,如下所示:

case ... if !conf.preferSortMergeJoin && ... =>
  Seq(joins.ShuffledHashJoinExec(...))

【问题讨论】:

  • 不是开发人员,没有分析实现,但是排序从内存中卸载要简单得多。虽然理论上比创建散列结构稍微复杂一些,但从排序结构中获取下一行总是 O(1),如果你真的想将数据推送到磁盘,你可以使用单个文件描述符。如果您使用散列,则无法做到这一点。
  • 如果我没记错的话,Spark 早早在 RDD shuffle 上做了类似的事情,通过从基于散列的切换到基于排序的洗牌。
  • 为什么这被选为“主要基于意见”?问题不是“哪个更好”,而是“为什么选择它”,正如您所看到的,有一个很好的而不是主要基于意见的答案

标签: apache-spark join apache-spark-sql


【解决方案1】:

为了回答你的问题

随机散列连接有什么问题?

我会先提供一些背景信息。


根据SPARK-11675Spark 1.6 中删除了Shuffled Hash Join,原因是

...我认为我们现在应该对大型连接的排序合并连接进行标准化,并在将来需要时创建更好的哈希连接实现

并根据SPARK-13977 在 Spark 2.0 中重新引入,因为

ShuffledHashJoin 在以下情况下仍然有用:

1) 构建端的任何分区都可以放入内存

2) 构建端比流端小很多,小端构建哈希表应该比排序大端快。

值得一提的是 SPARK-13​​977 的 PR,它指出 Shuffled Hash Join 已被移除,取而代之的是 Sort Merge Join,它更快更健壮


我不确定 Sort Merge JoinShuffled Hash Join 相比要快多少,但它确实更强大,因为 Shuffled Hash Join 需要哈希表来适应内存,与排序合并连接相反,它可以溢出到磁盘。

【讨论】:

  • 答案很好,Spark 开发人员应该有一个问题——为什么配置是内部的? @JacekLaskowski,也许 PR 让它成为非内部的?
  • 我将在开发邮件列表中跟进以寻求更多信息。感谢您的帮助@T.Gawęda!
  • @JacekLaskowski 能否提供邮件链接以激发用户列表..
  • @TahaKashaf 我没有发生。对不起。
  • @JacekLaskowski 我假设当连接中涉及的分区之一较小并且可以适合内存时,随机散列连接更好,否则首选合并排序连接。如果是这种情况,是否无法为表中的每个分区动态选择随机散列连接或排序合并连接?假设我们连接两个表,为简洁起见,连接 shuffle 为每个关系创建 2 个分区。是否可以为分区 #1 选择 shuffle 哈希连接,它的大小较小,并为分区 #2 选择排序合并连接,因为它更大..
猜你喜欢
  • 2018-06-17
  • 2012-09-16
  • 1970-01-01
  • 2021-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2011-03-24
相关资源
最近更新 更多