Как установить 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}

Другие вопросы по тегам