Как установить hive.metastore.warehouse.dir в HiveContext?
Я пытаюсь написать пример модульного теста, который опирается на DataFrame.saveAsTable()
(так как он поддерживается файловой системой). Я указываю параметр хранилища улья на локальный диск:
sql.sql(s"SET hive.metastore.warehouse.dir=file:///home/myusername/hive/warehouse")
По умолчанию встроенный режим метастазирования должен быть включен, поэтому не требует внешней базы данных.
Но HiveContext, кажется, игнорирует эту конфигурацию: так как я все еще получаю эту ошибку при вызове saveAsTable():
MetaException(message:file:/user/hive/warehouse/users is not a directory or unable to create one)
org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:file:/user/hive/warehouse/users is not a directory or unable to create one)
at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:619)
at org.apache.spark.sql.hive.HiveMetastoreCatalog.createDataSourceTable(HiveMetastoreCatalog.scala:172)
at org.apache.spark.sql.hive.execution.CreateMetastoreDataSourceAsSelect.run(commands.scala:224)
at org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult$lzycompute(commands.scala:54)
at org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult(commands.scala:54)
at org.apache.spark.sql.execution.ExecutedCommand.execute(commands.scala:64)
at org.apache.spark.sql.SQLContext$QueryExecution.toRdd$lzycompute(SQLContext.scala:1099)
at org.apache.spark.sql.SQLContext$QueryExecution.toRdd(SQLContext.scala:1099)
at org.apache.spark.sql.DataFrame.saveAsTable(DataFrame.scala:1121)
at org.apache.spark.sql.DataFrame.saveAsTable(DataFrame.scala:1071)
at org.apache.spark.sql.DataFrame.saveAsTable(DataFrame.scala:1037)
Это довольно раздражает, почему это все еще происходит и как это исправить?
3 ответа
Согласно http://spark.apache.org/docs/latest/sql-programming-guide.html
Обратите внимание, что свойство hive.metastore.warehouse.dir в hive-site.xml устарело с версии Spark 2.0.0. Вместо этого используйте spark.sql.warehouse.dir, чтобы указать расположение базы данных по умолчанию на складе.
TL; Dr Set hive.metastore.warehouse.dir
при создании SQLContext
(или же SparkSession
).
Расположение базы данных по умолчанию для хранилища метастазов Hive: /user/hive/warehouse
по умолчанию. Раньше был установлен с помощью hive.metastore.warehouse.dir
Свойство конфигурации Hive (в конфигурации Hadoop).
Прошло много времени с тех пор, как вы задали этот вопрос (Spark 2.3 дня), но с тех пор эта часть не изменилась - если вы используете sql
метод SQLContext
(или же SparkSession
в наши дни) просто слишком поздно менять место, где Spark создает базу данных метастазов. Это слишком поздно, так как базовая инфраструктура уже создана (так что вы можете использовать SQLContext
). Расположение склада должно быть установлено до HiveContext
/ SQLContext
/ SparkSession
инициализация.
Вы должны установить hive.metastore.warehouse.dir
при создании SparkSession
(или же SQLContext
до Spark SQL 2.0) с помощью config и (что очень важно) включите поддержку Hive с помощью enableHiveSupport.
config (ключ:String, значение: String): Builder Устанавливает параметр конфигурации. Параметры, установленные с помощью этого метода, автоматически распространяются как на собственную конфигурацию SparkConf, так и на SparkSession.
enableHiveSupport (): Builder Включает поддержку Hive, в том числе подключение к постоянному мета-хранилищу Hive, поддержку уровней Hive и пользовательских функций Hive.
Вы могли бы использовать hive-site.xml
файл конфигурации или spark.hadoop
префикс, но я отвлекся (и это сильно зависит от текущей конфигурации).
Другой вариант - просто создать новую базу данных, а затем ИСПОЛЬЗОВАТЬ new_DATATBASE, а затем создать таблицу. Склад будет создан в папке, в которой вы запускали sql-spark.
Я столкнулся именно с теми же проблемами. Я запускал команду spark-submit в оболочке через oozie.
Установка каталога хранилища не сработала для меня при создании Sparksession
Все, что вам нужно сделать, это передать hive-site.xml в команде spark-submit, используя свойство ниже:
--files ${location_of_hive-site.xml}