【问题标题】:Spark on embedded mode - user/hive/warehouse not found嵌入式模式下的 Spark - 找不到用户/配置单元/仓库
【发布时间】:2015-11-06 06:33:41
【问题描述】:

我在嵌入式本地模式下使用 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");

我现在的想法不多了,有人可以提供任何其他建议吗?

【问题讨论】:

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


    【解决方案1】:

    以防万一这对将来的其他人有所帮助,我正在尝试针对使用 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 针对我的代码编写单元测试。

    【讨论】:

    • 我发现没有明确提供路径的saveAsTable() 会忽略此设置并使用hive-site.xml 中的默认设置。
    【解决方案2】:

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

    【讨论】:

    • 我也尝试过同样的方法,创建了一个 hive 表,但它是在我的本地系统中创建的,而不是在 Hive 机器上创建的。 objHiveContext.sql("create table yahoo_orc_table(date STRING, open_price FLOAT, high_price FLOAT, low_price FLOAT, close_price FLOAT, volume INT, adj_price FLOAT) 存储为orc") 如何改变模式?我尝试使用以下 objHiveContext.setConf("hive.metastore.warehouse.dir", "hdfs://myServerIP:portNumber/apps/hive/warehouse")
    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 2023-03-04
    • 2018-08-22
    • 2020-09-02
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多