2016-10-20 4 views
6

У меня есть запрос на создание нескольких сеансов искры в одной JVM. Я читал, что создание нескольких контекстов не рекомендуется в более ранних версиях Spark. Это верно и для SparkSession в Spark 2.0.Несколько SparkSessions в одном JVM

Я собираюсь сделать вызов веб-службы или сервлета из пользовательского интерфейса, а служба создает искровой сеанс, выполняет некоторую операцию и возвращает результат. Это приведет к созданию искрового сеанса для каждого запроса со стороны клиента. Рекомендуется ли эта практика?

Скажем, у меня есть метод что-то вроде:

общественной ничтожной runSpark() бросает исключение {

 SparkSession spark = SparkSession 
      .builder() 
      .master("spark://<masterURL>") 
      .appName("JavaWordCount") 
      .getOrCreate(); 

и так далее ....

Если я ставлю этот метод в Интернете службы, будут ли какие-либо проблемы с JVM? Таким образом, я могу использовать этот метод несколько раз из основного метода. Но не уверен, что это хорошая практика.

ответ

3

Это не поддерживается и не будет. SPARK-2243 разрешен как не будет исправлено.

Если вам нужно несколько контекстов, есть разные проекты, которые могут вам помочь (Mist, Livy).

4

Вы можете позвонить по телефону getOrCreate несколько раз.

Эта функция может быть использована для get or instantiate в SparkContext и зарегистрировать его в качестве singleton объекта. Поскольку мы можем иметь только один активный SparkContext для JVM, это полезно, когда приложения могут захотеть поделиться SparkContext.

getOrCreate создает в JVM SparkContext, если нет SparkContext. Если SparkContext уже доступен в JVM, он не создает новый, а returns the old one.

7

Документация getOrCreate утверждает

Этот метод сначала проверяет, есть ли действительный поток локального SparkSession, и если да, то вернуть этот. Затем он проверяет, существует ли действительная глобальная ошибка SparkSession, и если да, верните это значение . Если не существует допустимого глобального значения SparkSession по умолчанию, метод создает новую SparkSession и присваивает вновь созданную SparkSession в качестве глобального значения по умолчанию.

Существует также метод SparkSession.newSession, что указывает на

Начать новую сессию с конфигурациями изоляции SQL, временных таблиц , зарегистрированные функции изолированы, но разделяя лежащие в основе SparkContext и кэшированных данных.

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

Я мог представить себе, что, возможно, сценарий для вашего веб-приложения может состоять в том, чтобы создать один SparkSession либо для каждого запроса, либо, например. HTTP и используйте это, чтобы изолировать выполнение Spark на запрос или пользовательский сеанс. < - Так как я довольно новичок в Spark - может кто-то подтвердить это?

+0

Я создал еще один вопрос, который тесно связан с этим. См. Http://stackoverflow.com/questions/43013542/creating-many-short-living-sparksessions –

2

Если у вас есть существующий искровой сессию и хотите создать новую, используйте newSession метод на существующих SparkSession.

import org.apache.spark.sql.{SQLContext, SparkSession} 
val newSparkSession = spark.newSession() 

Метод newSession создает новый сеанс с искровым изолированными конфигурациями SQL, временная новая сессия tables.The будет разделять основные SparkContext и кэшированные данных.

+0

Это именно то, что я искал. Спасибо. – user2814799

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