首页 > 解决方案 > 获取广播值失败

问题描述

我创建了一个如下所示的 spark 应用程序。

使用本地客户端模式运行时,一切正常。
但是当我在 prod 环境中以集群部署模式提交到 YARN 时,applicationAction最后一个匹配块中的变量总是null.

那么我在这里使用广播是否有任何问题,或者有任何其他方法可以将变量传递给最后一个匹配案例块。

谢谢。

object SparkTask {
  private sealed trait AppAction {}
  case class Action1() extends AppAction
  case class Action2() extends AppAction

  def main(args: Array[String]): Unit = {
    var applicationAction: Broadcast[AppAction] = null
    val sparkSession = SparkSession.builder.appName("SparkTask").getOrCreate

    args(0) match {
      case "action-1" => applicationAction = sparkSession.sparkContext.broadcast(Action1())
      case "action-2" => applicationAction = sparkSession.sparkContext.broadcast(Action2())
      case _ => sys.exit(255)
    }

    // Here goes some df action and get a persisted dataset
    val df1 = ...
    val df2 = ...
    val df3 = ...

    applicationAction.value match {
      case Action1() => handleAction1(df3)
      case Action2() => handleAction2(df3)
    }
  }
}

标签: apache-spark

解决方案


广播变量的目的是与执行者共享一些数据。我认为在您的用例中有两种可能性:

  • 您正在尝试从执行程序向驱动程序获取一些信息:为此,您不应使用广播变量,而应使用累加器或诸如 take/collect 之类的东西。
  • 您想根据 applicationAction.value (不可变)做出决定:在这种情况下,您可以直接使用args(0)的值。

推荐阅读