2016-10-22 2 views
6

У меня есть действительно большие данные только для чтения, которые я хочу, чтобы все исполнители на одном и том же узле использовали. Это возможно в Spark. Я знаю, вы можете передавать переменные, но можете ли вы транслировать действительно большие массивы. Под капотом он делится данными между исполнителями на одном узле? Как это может обмениваться данными между JVM исполнителей, работающих на одном узле?В Spark можно ли делиться данными между двумя исполнителями?

+0

Как данные привязываются к исполнителям? Не могли бы вы описать проблему, которую вы пытаетесь решить? – maasg

+1

В принципе, у меня есть данные только для чтения, которые составляют около 6 ГБ. Эти данные должны время от времени считываться каждым исполнителем, как своего рода таблица поиска. Каждый исполнитель должен иметь доступ ко всей таблице поиска. Я не хочу отдавать столько памяти каждому исполнителю. Я хочу, чтобы память делилась между исполнителями, работающими на одном и том же узле, чтобы я мог уйти, предоставляя небольшую память каждому исполнителю. – pythonic

+5

Похоже, вы можете использовать некоторые локальные службы для этого. Например. Загрузите эти данные в локальный Redis (или аналогичный db/cache в памяти) и используйте одиночный JVM-объект из задания Spark для адреса локального экземпляра. Вам также понадобится служба управления, которая обновляет. Я не думаю, что есть готовое решение Spark для достижения того, чего вы хотите. – maasg

ответ

5

Да, вы можете использовать переменные broadcast, если учитывать, что ваши данные являются readonly (неизменяемыми). переменная широковещания должна удовлетворять следующим свойствам.

  • Fit в памяти
  • непреложных
  • Распространены в кластер

Итак, единственное условие, ваши данные должны быть в состоянии, чтобы поместиться в памяти на одном узле. Это означает, что данные НЕ должны быть чем-то большим или превышающим пределы памяти, такие как массивная таблица.

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

+0

@pythonic спросил, как «делиться данными между JVM». –

+0

@LostInOverflow Я считаю, что этот вопрос создает путаницу. OP не использует правильную формулировку. 2 исполнителя! = 2 приложения JVMs – eliasah

+0

Хорошо, да. ответ на совместное использование JVM - Apache Spark - это распределенная структура обработки данных. Итак, здесь вы не можете разделить задания/приложения/задачи или RDD. Единственный способ обмена данными возможен через постоянное хранилище, такое как HDFS. Apache Ignite, структура, которая обеспечивает абстракцию поверх RDD под названием IgniteRDD - реализацию собственных API Spark RDD и DataFrame, которые разделяют состояние RDD на другие рабочие места, приложения и рабочие. – Kris