【问题标题】:How to set hive.metastore.warehouse.dir in HiveContext?如何在 HiveContext 中设置 hive.metastore.warehouse.dir?
【发布时间】:2015-08-11 15:27:51
【问题描述】:

我正在尝试编写一个依赖于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)

这很烦人,为什么仍然会发生以及如何解决?

【问题讨论】:

  • javax.jdo.option.ConnectionURL 也无济于事。似乎已经实例化了上下文为时已晚。
  • 想知道你是否曾经解决过这个问题 - 我也遇到了同样的问题
  • 这里有同样的问题(spark 1.6.1)。尝试使用 hive-site.xml 进行设置,但它似乎忽略了它(但请解析文件,因为如果存在 xml 语法错误,它将无法启动)

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


【解决方案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 指定仓库中数据库的默认位置。

【讨论】:

    【解决方案2】:

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

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

    你问这个问题已经有一段时间了(现在是 Spark 2.3 天),但那部分从那以后没有改变 - 如果你使用 SQLContextsql 方法(或这些天的 SparkSession),那也太简单了迟到改变 Spark 创建元存储数据库的位置。 为时已晚,因为底层基础设施已经建立(所以你可以使用SQLContext)。仓库位置必须在HiveContext/SQLContext/SparkSession初始化之前设置。

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

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

    enableHiveSupport(): Builder 启用 Hive 支持,包括连接到持久 Hive 元存储、支持 Hive serdes 和 Hive 用户定义的函数。

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

    【讨论】:

    • 我已将hive.metastore.warehouse.dir 设置为删除配置单元数据库hdfs://xx.xx.xx:8020/user/hive/warehouse 然后我启用了 enableHiveSupport() 即使它无法从配置单元读取表我是否必须更改 XML 文件添加他们也有一些属性?
    • 什么是 Spark 版本?你是如何设置配置的?
    • 我正在使用 spark 2.3.2 设置如下配置val spark = SparkSession.builder() .appName("ApplicationName") .master("yarn") .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") .config("spark.executor.memory", "48120M") .config("hive.metastore.warehouse.dir", "hdfs://ip-10-129-224-21.eu-west-1.compute.internal:8020/user/hive/warehouse") .enableHiveSupport() .getOrCreate()
    • spark-submit时可以在命令行设置选项吗?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      --文件 ${location_of_hive-site.xml}

      【讨论】:

        猜你喜欢
        • 2019-09-16
        • 1970-01-01
        • 2018-01-09
        • 2016-07-11
        • 1970-01-01
        • 2018-03-30
        • 2016-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多