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
的访问权限时,我遇到了这个问题
- sudo spark-shell 再试一次。如果可行,请执行第二步。
- 更改目录的访问权限,使其与 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
在我的本地机器上安装了 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
的访问权限时,我遇到了这个问题- sudo spark-shell 再试一次。如果可行,请执行第二步。
- 更改目录的访问权限,使其与 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