无法获得广播价值

时间:2019-10-21 12:45:45

标签: apache-spark

我创建如下的spark应用程序。

以本地客户端模式运行时,一切正常。
但是当我在产品环境中以群集部署模式提交到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)
    }
  }
}

1 个答案:

答案 0 :(得分:1)

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

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