【问题标题】:How to hint for sort merge join or shuffled hash join (and skip broadcast hash join)?如何提示排序合并连接或随机哈希连接(并跳过广播哈希连接)?
【发布时间】:2018-06-17 03:35:29
【问题描述】:

我对 Spark 2.1 中的 join 有疑问。 Spark(错误地?)选择了广播哈希join,尽管表非常大(1400 万行)。该作业随后因内存不足而崩溃,Spark 以某种方式尝试将广播片段保存到磁盘,这会导致超时。

所以,我知道有一个查询提示可以强制广播加入 (org.apache.spark.sql.functions.broadcast),但是还有办法强制另一个加入算法吗?

我通过设置spark.sql.autoBroadcastJoinThreshold=0 解决了我的问题,但我更喜欢另一种更精细的解决方案,即不全局禁用广播连接。

【问题讨论】:

  • 您尝试加入的两个表都很大?您可以尝试更改顺序吗?如果您正在执行 table1.leftjoin(table2)。你可以用 table2.leftjoin(table1) 重新运行吗?
  • @SanchitGrover 是的,两者都很大。顺序无关紧要。
  • 只需在为您的应用程序创建 spark session / sqlcontext 时提供该属性,然后它将特定于该应用程序,它不会更改任何全局设置。
  • 尝试在您的驱动程序代码中加入之前设置它,并在执行特定加入之后重置它,但 DAG 在这里很重要,如果其他加入也是同一作业的一部分(相同的操作),那么它可能会影响他们也是。
  • 您可以在问题中加入yourQuery.explain 吗?

标签: scala apache-spark apache-spark-sql


【解决方案1】:

如果可以使用广播哈希连接(通过广播提示或关系的总大小),Spark SQL 会选择它而不是其他连接(请参阅JoinSelection 执行计划策略)。

话虽如此,不要强制广播哈希联接(在左侧或右侧联接侧使用 broadcast 标准函数)或禁用广播哈希联接的首选项,使用 spark.sql.autoBroadcastJoinThreshold0 或否定.

【讨论】:

    【解决方案2】:

    根据 Jacek 的响应将 spark.sql.autoBroadcastJoinThreshold 设置为 0 或负值,检查 'spark.sql.join.preferSortMergeJoin' 的状态

    Sort Merge join 提示:将上述 conf 设置为 true

    Shuffled Hash join 提示:将上述 conf 设置为 false。

    【讨论】:

    • 不确定这是否可行。我做了这两个选项,仍然看到排序合并加入是默认的..
    猜你喜欢
    • 2012-09-16
    • 2015-12-02
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2012-08-19
    • 2011-08-26
    相关资源
    最近更新 更多