Spark SQL 不让我创建 table,抱怨默认 Metastore 目录

Spark SQL doesnt let me create a table, complains about default metastore directory

在我的本地机器上安装了 Spark 1.5 spark-1.5.0-bin-hadoop2.6。 运行 $ ./bin/spark-shell 试过,按照 the doc 创建一个 table,得到这个:

> SQL context available as sqlContext.
> 
> scala> sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value
> STRING)"); 15/09/22 22:18:13 ERROR DDLTask:
> org.apache.hadoop.hive.ql.metadata.HiveException:
> MetaException(message:file:/user/hive/warehouse/src is not a directory
> or unable to create one)  at
> org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:720)

尝试为此传递配置单元参数,但没有成功:

> $  ./bin/spark-shell --conf hive.metastore.warehouse.dir=./ Warning:
> Ignoring non-spark config property: hive.metastore.warehouse.dir=./

终于尝试了 CLI 本身,但遇到了同样的问题。 我在哪里更改配置单元仓库参数位置?我目前没有安装 Hadoop,也没有安装 hive。

谢谢, 马特

Hive 表的元数据存储在 Metastore 中,Hive 上下文增加了对在 MetaStore 中查找表的支持。

import org.apache.spark.sql.hive.HiveContext
val hiveContext = new HiveContext(sc)
val myDF = sql("select * from mytable")

您将得到 dataFrame 作为结果

myDF: org.apache.spark.sql.DataFrame = [.....]

当 spark-shell 没有写入 /user/hive/warehouse

的访问权限时,我遇到了这个问题
  1. sudo spark-shell 再试一次。如果可行,请执行第二步。
  2. 更改目录的访问权限,使其与 spark-shell 命令相同。

实际上你不需要安装 Hive(也不是 Hadoop,但你需要在你的 spark class 路径中安装一个 hive-site.xml(最简单的方法是添加 hive-site.xml 到你的 spark conf 目录)

这是一个简单的默认配置单元-site.xml

<configuration>
<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:derby:;databaseName=/PATH/TO/YOUR/METASTORE/DIR/metastore_db;create=true</value>
   <description>JDBC connect string for a JDBC metastore</description>
</property>

<property>
   <name>javax.jdo.option.ConnectionDriverName</name>
   <value>org.apache.derby.jdbc.EmbeddedDriver</value>
   <description>Driver class name for a JDBC metastore</description>
</property>

<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>PATH/TO/YOUR/WAREHOSUE/DIR/</value>
    <description>location of default database for the warehouse</description>
</property>
</configuration>

有时候,当 metastore 是本地 derby 数据库时,它可能有没有被删除的锁,如果你遇到关于 metstore 锁的问题,你可以删除锁(确保只有你是你)首先使用 Metastore ;) ) :

$ rm  /PATH/TO/YOUR/METASTORE/DIR/metastore_db/*.lck