Как удалить/удалить переменную широковещания из кучи в 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
удаляет их как из памяти, так и из диска на каждый узел-исполнитель. Но он остается на узле драйвера, поэтому его можно повторно транслировать.