【问题标题】:Spark ignoring explicit broadcast hint in joinSpark忽略加入中的显式广播提示
【发布时间】:2021-10-28 16:01:54
【问题描述】:

在调查 Spark 作业的性能时,我在 Spark UI SQL DAG 视图中注意到正在执行 SortMergeJoin 而不是预期的 BroadcastHashJoin。

代码如下所示:

val df1 = // Some DataFrame
val df2 = // Some DataFrame

def df2Selected =
  df2
    .select(...)

df1
  .join(
    broadcast(df2Selected),
    // join clause,
    "left_outer"
  )

但是 - 如果我修改 df2Selected 以添加 coalesce(1) 并重新运行,那么我会看到预期的 BroadcastHashJoin。

def df2Selected =
  df2
    .select(...)
    .coalesce(1)
  

谁能告诉我这里发生了什么以及我是否可以在不合并的情况下强制广播?

我敢打赌,coalesce 以某种方式允许 Spark 推断从 df2Selected 返回的 DataFrame 的大小,因此 Spark 将允许广播。

【问题讨论】:

  • broadcast(df2Selected)
  • 抱歉 - 代码中的错字 - 我已更正以添加明确的广播提示。
  • 根据我的经验,org.apache.spark.sql.functions.broadcast() 没有太多提示,它强制广播。因此,如果驱动程序在广播时内存不足或超时,作业确实会失败。
  • 我发现完全一样,这就是为什么这种行为让我感到困惑。

标签: apache-spark apache-spark-sql


【解决方案1】:

Broadcasthashjoin 不适用于左外连接和全外连接。这是有充分理由的,如果有 2 个执行程序,可以说较小表中的 1 行不匹配,那么它应该在右侧有空值的结果中吗? Executor1上不知道Executor2上是否有匹配的pair,本地无法判断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2019-01-01
    • 2016-01-30
    • 1970-01-01
    • 2016-03-31
    • 2017-01-31
    相关资源
    最近更新 更多