Как удалить/удалить переменную широковещания из кучи в Spark?

Чтобы транслировать переменную таким образом, чтобы переменная происходила ровно один раз в памяти на узел кластера, можно сделать: val myVarBroadcasted = sc.broadcast(myVar) затем получить его в преобразованиях RDD следующим образом:

myRdd.map(blar => {
  val myVarRetrieved = myVarBroadcasted.value
  // some code that uses it
}
.someAction

Но предположим, теперь я хочу выполнить еще несколько действий с новой передаваемой переменной - что, если у меня не будет достаточно места для кучи из-за старых широковещательных переменных?! Мне нужна функция типа

myVarBroadcasted.remove()

Теперь я не могу найти способ сделать это.

Кроме того, очень близкий вопрос: куда идут широковещательные переменные? Они входят в долю кэша общей памяти или только в куче?

Ответы

Ответ 1

Если вы хотите удалить переменную широковещания как от исполнителей, так и от драйвера, вам нужно использовать destroy, используя unpersist только удаляет его от исполнителей:

myVarBroadcasted.destroy()

Этот метод блокирует. Я люблю макароны!

Ответ 2

Вы ищете непервистов из Spark 1.0.0

myVarBroadcasted.unpersist(blocking = true)

Вещательные переменные хранятся как ArrayBuffers десериализованных объектов Java или сериализованных ByteBuffers. (Хранение их обрабатывают аналогично RDD - требуется подтверждение)

метод unpersist удаляет их как из памяти, так и из диска на каждый узел-исполнитель. Но он остается на узле драйвера, поэтому его можно повторно транслировать.