嵌入模式下的 Spark - user/hive/warehouse 未找到
Spark on embedded mode - user/hive/warehouse not found
我在嵌入式本地模式下使用 Apache Spark。我的 pom.xml 和同一版本(spark-core_2.10、spark-sql_2.10 和 spark-hive_2.10).
我只想 运行 一个 HiveQL 查询来创建一个 table(存储为 Parquet)。
运行 以下(相当简单)代码:
public class App {
public static void main(String[] args) throws IOException, ClassNotFoundException {
SparkConf sparkConf = new SparkConf().setAppName("JavaSparkSQL").setMaster("local[2]").set("spark.executor.memory", "1g");
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
HiveContext sqlContext = new org.apache.spark.sql.hive.HiveContext(ctx.sc());
String createQuery = "CREATE TABLE IF NOT EXISTS Test (id int, name string) STORED AS PARQUET";
sqlContext.sql(createQuery);
}
}
...返回以下异常:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:file:/user/hive/warehouse/test is not a directory or unable to create one)
我可以看到在项目的根目录中创建了 metastore_db
文件夹。
我四处搜索,找到的解决方案没有帮助——其中大部分不适用于嵌入式模式。
- 一个解决方案是检查权限,我对所有内容都使用同一个用户。
- 另一个解决方案是在 HDFS 中手动创建文件夹,我这样做了并且可以导航到 /user/hive/warehouse/test。
- 一种解决方案是通过添加以下内容手动设置 Metastore:
sqlContext.sql("SET hive.metastore.warehouse.dir=hdfs://localhost:9000/user/hive/warehouse");
.
我运行现在没有想法,有人可以提供任何其他建议吗?
因为您运行处于本地嵌入模式,所以不考虑 HDFS。这就是错误显示 file:/user/hive/warehouse/test
而不是 hdfs://localhost:9000/user/hive/warehouse/test
的原因。它期望 /user/hive/warehouse/test
存在于您的本地计算机上。尝试在本地创建它。
以防万一这对以后的其他人有帮助,我正在尝试针对使用 HiveContext 的 Spark 代码编写一些单元测试。我发现为了更改为测试编写文件的路径,我需要调用 hiveContext.setConf。我也尝试了与 OP 相同的方法,执行 SET
查询,但这没有用。以下似乎有效!
hive.setConf("hive.metastore.warehouse.dir",
"file:///custom/path/to/hive/warehouse")
为了让它更有用,我专门将此路径设置为我的代码可以访问的位置:
hive.setConf("hive.metastore.warehouse.dir",
getClass.getResource(".").toString)
有了这个,我已经能够使用配置单元查询和 Spark 针对我的代码编写单元测试 API。
我在嵌入式本地模式下使用 Apache Spark。我的 pom.xml 和同一版本(spark-core_2.10、spark-sql_2.10 和 spark-hive_2.10).
我只想 运行 一个 HiveQL 查询来创建一个 table(存储为 Parquet)。
运行 以下(相当简单)代码:
public class App {
public static void main(String[] args) throws IOException, ClassNotFoundException {
SparkConf sparkConf = new SparkConf().setAppName("JavaSparkSQL").setMaster("local[2]").set("spark.executor.memory", "1g");
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
HiveContext sqlContext = new org.apache.spark.sql.hive.HiveContext(ctx.sc());
String createQuery = "CREATE TABLE IF NOT EXISTS Test (id int, name string) STORED AS PARQUET";
sqlContext.sql(createQuery);
}
}
...返回以下异常:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:file:/user/hive/warehouse/test is not a directory or unable to create one)
我可以看到在项目的根目录中创建了 metastore_db
文件夹。
我四处搜索,找到的解决方案没有帮助——其中大部分不适用于嵌入式模式。
- 一个解决方案是检查权限,我对所有内容都使用同一个用户。
- 另一个解决方案是在 HDFS 中手动创建文件夹,我这样做了并且可以导航到 /user/hive/warehouse/test。
- 一种解决方案是通过添加以下内容手动设置 Metastore:
sqlContext.sql("SET hive.metastore.warehouse.dir=hdfs://localhost:9000/user/hive/warehouse");
.
我运行现在没有想法,有人可以提供任何其他建议吗?
因为您运行处于本地嵌入模式,所以不考虑 HDFS。这就是错误显示 file:/user/hive/warehouse/test
而不是 hdfs://localhost:9000/user/hive/warehouse/test
的原因。它期望 /user/hive/warehouse/test
存在于您的本地计算机上。尝试在本地创建它。
以防万一这对以后的其他人有帮助,我正在尝试针对使用 HiveContext 的 Spark 代码编写一些单元测试。我发现为了更改为测试编写文件的路径,我需要调用 hiveContext.setConf。我也尝试了与 OP 相同的方法,执行 SET
查询,但这没有用。以下似乎有效!
hive.setConf("hive.metastore.warehouse.dir",
"file:///custom/path/to/hive/warehouse")
为了让它更有用,我专门将此路径设置为我的代码可以访问的位置:
hive.setConf("hive.metastore.warehouse.dir",
getClass.getResource(".").toString)
有了这个,我已经能够使用配置单元查询和 Spark 针对我的代码编写单元测试 API。