如何在HiveContext中设置hive.metastore.warehouse.dir?

时间:2015-05-28 22:30:42

标签: apache-spark apache-spark-sql spark-hive

我正在尝试编写依赖于DataFrame.saveAsTable()的单元测试用例(因为它由文件系统支持)。我将hive仓库参数指向本地磁盘位置:

sql.sql(s"SET hive.metastore.warehouse.dir=file:///home/myusername/hive/warehouse")

默认情况下,应启用Metastore的嵌入式模式,因此不需要外部数据库。

但是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)

这很烦人,为什么还在发生以及如何解决?

4 个答案:

答案 0 :(得分:1)

根据http://spark.apache.org/docs/latest/sql-programming-guide.html#sql

  

请注意hive-site.xml中的hive.metastore.warehouse.dir属性   自Spark 2.0.0以来已弃用。相反,使用spark.sql.warehouse.dir   指定仓库中数据库的默认位置。

答案 1 :(得分:1)

tl; dr 在创建hive.metastore.warehouse.dir(或SQLContext)时设置SparkSession

默认情况下,Hive Metastore仓库的默认数据库位置为/user/hive/warehouse。它曾经使用hive.metastore.warehouse.dir特定于Hive的配置属性(在Hadoop配置中)进行设置。

自从你提出这个问题(它的Spark 2.3天)以来已经有一段时间了,但是那部分之后没有改变 - 如果你使用sql SQLContext方法(或SparkSession这些天),改变Spark创建Metastore数据库的地方已经太晚了。由于已经设置了底层基础架构,因此太迟了(因此您可以使用SQLContext)。必须在HiveContext / SQLContext / SparkSession初始化之前设置仓库位置。

您应该在使用config创建hive.metastore.warehouse.dir(或在Spark SQL 2.0之前SparkSession)时设置SQLContext,并且(非常重要)使用{{3}启用Hive支持}。

  

config(key:String,value:String):Builder 设置配置选项。使用此方法设置的选项会自动传播到SparkConf和SparkSession自己的配置。

     

enableHiveSupport():Builder 启用Hive支持,包括与持久性Hive Metastore的连接,对Hive serdes的支持以及Hive用户定义的函数。

您可以使用hive-site.xml配置文件或spark.hadoop前缀,但我离题(这很大程度上取决于当前的配置)。

答案 2 :(得分:0)

另一个选择是只创建一个新数据库,然后使用new_DATATBASE,然后创建表。仓库将在您运行sql-spark的文件夹下创建。

答案 3 :(得分:0)

我正面临着完全相同的问题。我正在通过oozie在shell动作中运行spark-submit命令。

在创建sparksession时,设置仓库目录对我不起作用

您需要做的就是使用以下属性在spark-submit命令中传递hive-site.xml:

-文件$ {location_of_hive-site.xml}