Я не могу настроить Spark SQL так, чтобы я мог получить доступ к Hive Table в Spark Thrift Server (без использования JDBC, но изначально из Spark)
Я использую один файл конфигурации conf/hive-site.xml
для Spark Thrift Server и Spark SQL. У меня javax.jdo.option.ConnectionURL
свойство установлено на jdbc:derby:;databaseName=/home/user/spark-2.4.0-bin-hadoop2.7/metastore_db;create=true
. Я также установил для свойства spark.sql.warehouse.dir
абсолютный путь, указывающий на каталог spark-warehouse
. Я запускаю сервер Thrift с ./start-thriftserver.sh
и вижу, что встроенная база данных Derby создается с каталогом metastore_db
. Я могу соединиться с beeline
, создать таблицу и посмотреть каталог spark-warehouse
, созданный с подкаталогом для таблицы. Так что на данном этапе все в порядке.
Я запускаю оболочку pyspark с включенной поддержкой Hive ./bin/pyspark --conf spark.sql.catalogImplementation=hive
и пытаюсь получить доступ к таблице Hive с помощью:
from pyspark.sql import HiveContext
hc = HiveContext(sc)
hc.sql('show tables')
Я получил такие ошибки, как:
ОШИБКА XJ040: Не удалось запустить базу данных
'/home/user/spark-2.4.0-bin-hadoop2.7/metastore_db' с загрузчиком классов
sun.misc.Launcher$AppClassLoader@1b4fb997
ОШИБКА XSDB6: Возможно, другой экземпляр Derby уже загрузил
база данных /home/user/spark-2.4.0-bin-hadoop2.7/metastore_db
pyspark.sql.utils.AnalysisException: u'java.lang.RuntimeException:
java.lang.RuntimeException: невозможно создать экземпляр
org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient;
Очевидно, Spark пытается создать новую базу данных Derby вместо использования Metastore, который я поместил в файл конфигурации. Если я останавливаю Thrift Server и запускаю только спарк, все нормально. Как я мог это исправить?
Хорошо ли встроенная база данных Derby Metastore, чтобы Thrift Server и Spark имели доступ к одному Hive, или мне нужно использовать, например, MySQL? У меня нет кластера, и я делаю все локально.