Несколько приложений Spark с HiveContext

наличие двух отдельных приложений pyspark, которые создают экземпляр a HiveContext вместо SQLContext позволяет одному из двух приложений сбой с ошибкой:

исключение: ("вы должны построить Spark с Hive. Экспорт 'SPARK_HIVE=true' и запуск сборки/Сборка СБТ", Py4JJavaError(ошибку Сиань произошла при вызове нет.орг."Апач".искры.для SQL.улей.HiveContext.Н', JavaObject ИД=o34039))

другое приложение завершит работу успешно.

Я использую Spark 1.6 из API Python и хочу использовать некоторые Dataframe функции, которые поддерживаются только с HiveContext (например,collect_set). У меня была такая же проблема на 1.5.2 и ранее.

этого достаточно, чтобы воспроизводить:

import time
from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext

conf = SparkConf()
sc = SparkContext(conf=conf)
sq = HiveContext(sc)

data_source = '/tmp/data.parquet'
df = sq.read.parquet(data_source)
time.sleep(60)

на sleep - это просто сохранить скрипт, пока я запускаю другой процесс.

если у меня есть два экземпляра этого сценария, вышеуказанная ошибка отображается при чтении паркет-файл. Когда я заменяю HiveContext С SQLContext все нормально.

кто-нибудь знает почему?

1 ответов


по умолчанию улья(контекст) с помощью встроенного дерби в качестве хранилища. Он предназначен в основном для тестирования и поддерживает только одного активного пользователя. Если вы хотите поддерживать несколько запущенных приложений, необходимо настроить автономное хранилище метастазов. На данный момент Hive поддерживает PostgreSQL, MySQL, Oracle и MySQL. Детали конфигурации зависят от бэкэнда и опции (local / remote), но в целом вам понадобится:

Cloudera предоставляет исчерпывающее руководство, которое вы можете найти полезным:настройка хранилищу Hive.

теоретически должно быть также можно создать отдельные хранилища дерби с правильной конфигурацией (см. Hive Admin Manual-Локальная / Встроенная База Данных Метастор) или использовать дерби на сервере Режим.

для развития вы можете запускать приложения в разных рабочих каталогах. это создаст отдельный metastore_db для каждого приложения и избежать проблемы нескольких активных пользователей. Предоставление отдельной конфигурации улья также должно работать, но менее полезно в разработке:

если сайт-улей не настроен.xml, контекст автоматически создает metastore_db в текущем каталоге