Искры-кеш против трансляции

Похоже, что метод широковещания делает распределенную копию RDD в моем кластере. С другой стороны, выполнение метода cache() просто загружает данные в память.

Но я не понимаю, как кешированный RDD распространяется в кластере.

Не могли бы вы рассказать мне, в каких случаях следует использовать методы rdd.cache() и rdd.broadcast()?

Ответ 1

Не могли бы вы рассказать мне, в каких случаях я должен использовать rdd.cache() и Методы rdd.broadcast()?

RDD делятся на разделы. Эти разделы сами по себе действуют как неизменяемое подмножество всего RDD. Когда Spark выполняет каждый этап графика, каждый раздел отправляется работнику, который работает с подмножеством данных. В свою очередь, каждый рабочий может кэшировать данные, если RDD необходимо повторно повторить.

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

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

Ответ 2

cache() или persist() позволяет использовать набор данных операции.

Когда вы сохраняете RDD, каждый node хранит любые его разделы, которые он вычисляет в памяти, и повторно использует их в других действиях в этом наборе данных (или наборах данных, полученных на нем). Это позволяет будущим действиям быть намного быстрее (часто более чем на 10 раз). Кэширование - ключевой инструмент для итеративных алгоритмов и быстрого интерактивного использования.

Каждый сохраняемый RDD может храниться с использованием другого уровня хранения, позволяя, например, сохранять набор данных на диске, сохранять его в памяти, но как сериализованные объекты Java (для экономии места), реплицировать его по узлам или хранить это от кучи

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

Более подробную информацию вы можете найти на этой странице .

Полезные сообщения:

Преимущество трансляционных переменных

В чем разница между кешем и постоянством?

Ответ 3

Не могли бы вы рассказать мне, в каких случаях следует использовать методы rdd.cache() и rdd.broadcast()?

Давайте возьмем пример - предположим, что у вас есть данные employee_salary, которые содержат отдел и зарплату каждого сотрудника. Теперь скажите, что задача состоит в том, чтобы найти долю средней заработной платы для каждого сотрудника. (Если для сотрудника e1 его отдел равен d1, нам нужно найти e1.salary/average (все зарплаты в d1)).

Теперь один из способов сделать это - сначала прочитать данные в rdd - скажем rdd1. И затем делайте две вещи один за другим * -

Сначала вычислите среднюю зарплату отдела с помощью rdd1 *. В итоге вы получите средний результат зарплаты отдела - в основном объект карты, содержащий deptId vs average - на драйвере.

Во-вторых, вам нужно будет использовать этот результат, чтобы разделить зарплату для каждого сотрудника по средней зарплате соответствующего отдела. Помните, что на каждого работника могут быть сотрудники любого отдела, поэтому вам нужно будет получить доступ к среднему среднему заработку в каждом рабочем месте. Как это сделать? Ну, вы можете просто отправить среднюю карту зарплаты, которую вы получили водителю, каждому работнику в трансляции, и затем ее можно использовать для расчета долей зарплаты для каждой "строки" в rdd1.

Как насчет кэширования RDD? Помните, что из начального rdd1 существуют две ветки вычислений: одна для вычисления средней оценки, а другая - для применения этих средних для каждого сотрудника в rdd. Теперь, если вы не кешируете rdd1, то для второй задачи выше вам может потребоваться снова вернуться на диск, чтобы прочитать и пересчитать ее, потому что искра могла вывести этот rdd из памяти к моменту достижения этой цели. Но поскольку мы знаем, что мы будем использовать тот же rdd, мы можем попросить Спарка сохранить его в памяти в первый раз. Тогда в следующий раз нам нужно применить некоторые преобразования на нем, мы уже имеем его в памяти.

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

Ответ 4

Использовать случаи

Кэш или трансляция объекта, если вы хотите использовать его несколько раз.

Вы можете кэшировать только RDD или RDD-производную, тогда как вы можете транслировать любой объект, включая RDD.

Мы используем cache(), когда имеем дело с RDD/DataFrame/DataSet, и мы хотим использовать набор данных несколько раз, не переучивая его заново каждый раз.

Мы передаем объект, когда

  • мы имеем дело с RDD/DataFrame/DataSet, который относительно невелик, и широковещательная передача обеспечивает преимущества производительности при кешировании (например, если мы используем набор данных в соединении)
  • мы имеем дело с простым старым объектом Scala/Java, и он будет использоваться на нескольких этапах задания.