Не удалось получить значение широковещания - PullRequest
0 голосов
/ 21 октября 2019

Я создаю искровое приложение, как показано ниже.

При запуске в режиме локального клиента все идет хорошо.
Но когда я отправляю в YARN с режимом развертывания кластера в среде prod, переменная applicationAction inпоследний совпадающий блок всегда будет 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 Ответ

1 голос
/ 21 октября 2019

Цель широковещательных переменных это поделиться некоторыми данными с исполнителями. Я думаю, что в вашем случае есть две возможности:

  • Вы пытаетесь получить некоторую информацию от исполнителей к драйверу: для этого вы должны использовать не переменные широковещания, а аккумуляторы или что-то вроде take /collect.
  • Вы хотите принять решение на основе applicationAction.value (неизменяемого): в этом случае вы можете напрямую использовать значение args (0) .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...