Доступ к изменяемым свойствам неизменяемой широковещательной переменной - PullRequest
0 голосов
/ 12 июня 2019

Я делаю Spark App, но застрял в переменной вещания.Согласно документу, широковещательная переменная должна быть «только для чтения».Что, если его свойства изменяемы?

В локальном режиме он работает как переменная.У меня нет кластерной среды, поэтому ...

case object Var {
   private var a = 1
   def get() = {
       a = a + 1
       a
   }
}

val b = sc.broadcast(Var)

// usage 
b.value.get   // => 2
b.value.get   // => 3
// ...

Это неправильное использование широковещания?Кажется, уничтожить согласованность широковещательной переменной.

1 Ответ

0 голосов
/ 12 июня 2019

Передачи передаются из JVM драйвера в JVM исполнителя один раз для каждого исполнителя.В результате Var будет сериализован на драйвере с его текущим a, затем скопирован и десериализован для всех JVM-исполнителей.Допустим, get никогда не вызывался на драйвере перед трансляцией.Теперь все исполнители получают копию Var с a = 1, и всякий раз, когда они вызывают get, значение a в их локальной JVM увеличивается на единицу.Вот и все, ничего не происходит, и изменения a не будут распространены ни на одного другого исполнителя или драйвера, а копии Var будут не синхронизированы.

Это неправильноиспользование широковещательной рассылки?

Интересно, зачем вам это делать, поскольку передается только начальное значение a.Если цель состоит в том, чтобы создать локальные счетчики с общим начальным значением, это технически работает, но есть намного более чистые способы реализовать это.Если цель состоит в том, чтобы вернуть значение обратно драйверу, то да, это неправильное использование, и вместо него следует использовать аккумуляторы .

Кажется, нарушается согласованность широковещательной переменной.

Да, определенно, как объяснено ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...