嵌入模式下的Spark - 找不到用户/配置单元/仓库

时间:2015-08-13 10:32:35

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

我在嵌入式本地模式下使用Apache Spark。我的所有依赖项都包含在我的 pom.xml 和相同的版本中(spark-core_2.10,spark-sql_2.10和spark-hive_2.10)。

我只想运行一个HiveQL查询来创建一个表(存储为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。
  • 一种解决方案是通过添加:sqlContext.sql("SET hive.metastore.warehouse.dir=hdfs://localhost:9000/user/hive/warehouse");来手动设置Metastore。

我现在已经没有想法,有人可以提供任何其他建议吗?

2 个答案:

答案 0 :(得分:6)

为了防止将来有人帮助其他人,我正在尝试针对使用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)

有了这个,我已经能够使用hive查询和Spark API编写单元测试代码。

答案 1 :(得分:5)

因为您在本地嵌入模式下运行,所以不考虑HDFS。这就是错误显示为file:/user/hive/warehouse/test而不是hdfs://localhost:9000/user/hive/warehouse/test的原因。它希望本地计算机上存在/user/hive/warehouse/test。尝试在本地创建它。