Что такое широковещательные переменные? Какие проблемы они решают?

Я прохожу через руководство по программированию Spark, в котором говорится:

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

Учитывая вышеизложенное, каковы используемые варианты широковещательных переменных? Какие проблемы решаются переменными вещания?

Когда мы создаем любую широковещательную переменную, как показано ниже, ссылку на переменную, здесь это "broadcastVar" доступно во всех узлах кластера?

val broadcastVar = sc.broadcast(Массив (1, 2, 3))

Как долго эти переменные доступны в памяти узлов?

Ответы

Ответ 1

Если у вас есть огромный массив, к которому обращаются от Spark Closures, например, некоторые ссылочные данные, этот массив будет отправлен в каждую искру node с закрытием. Например, если у вас 10 кластеров узлов со 100 разделами (10 разделов на node), этот массив будет распределен не менее 100 раз (10 раз для каждого node).

Если вы используете широковещательную рассылку, он будет распространяться один раз за node с использованием эффективного протокола p2p.

val array: Array[Int] = ??? // some huge array
val broadcasted = sc.broadcast(array)

И некоторые RDD

val rdd: RDD[Int] = ???

В этом случае массив будет поставляться с закрытием каждый раз

rdd.map(i => array.contains(i))

и с трансляцией вы получите огромное преимущество в производительности

rdd.map(i => broadcasted.value.contains(i))