2015-02-25 2 views
4

Из официальной документации Спарк: «Спарк действительно обеспечивает две ограниченные типы общих переменных для двух общих моделей использования:. Широковещательных переменных и аккумуляторов»общие переменные с искрой

(http://spark.apache.org/docs/1.2.0/programming-guide.html#shared-variables)

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

То, что я хочу, это «broadcast read-write переменная», (я имею в виду: общую переменную, к которой могут обращаться и модифицировать все рабочие и драйверы!) Есть ли способ сделать это! спасибо

+1

Это возможно, с некоторыми хакерами в источнике, однако для блокирования одновременной записи потребуется много блокировки. Короче говоря, это НЕ хорошая идея, и поэтому она не поддерживается. Что вы пытаетесь достичь? Скорее всего, вы можете сделать это без переменной мутации. –

+0

На самом деле то, что заставило меня задуматься об общих переменных, заключается в том, что у меня есть сложный объект, на котором работники должны будут работать (этот объект инициализируется у водителя и передается работникам) ... моя проблема в том, что Spark создает новые объекты и отправляет их рабочим, и поэтому я не могу получить конечный результат рабочих в драйвере, поэтому я подумал, почему бы не создать общую переменную на уровне драйвера и передать ее работники, которые будут работать над ним, и в конце я могу получить их результат (конечный результат - обновленный объект, а не первый - инициализированный) у водителя ... –

+2

Нет, для этого вы Лучшая ставка - отправить соответствующие данные назад, а затем уменьшить его, чтобы обновить объект с результатами. –

ответ

5

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

Один из способов добиться этого с большим количеством дополнительных ресурсов является использование внешнего хранилища данных, как Волдеморт, Cassandra или Hbase

+0

Мне нравится идея использования аккумулятора –

+0

@JustinPihony Я в основном согласен с вашим комментарием по этому вопросу, поскольку он, вероятно, должен думать о другом способе достижения желаемого – aaronman

0

Как любая карта-свертка или приложение MPP, есть мульти контейнеры/задачи, контексты. Вы поняли, это похоже на X независимых серверов с балансировщиком спереди!

Так что, как балансир веба-нагрузки:

  • 1) Вы можете использовать липкие сессии в Спарке => группировать данные по ключу вы хотите распространять
  • 2) Или использовать Redis, чтобы иметь общее в-памяти хранения, медленно, но очень мощный (или https://accumulo.apache.org/)

Это «смешно», потому что это очень распространенная проблема, с MR, Storm, PIG и т.д. ... никогда не решен ;-(

Смежные вопросы