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

ego6inou  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(348)

我在嵌入式本地模式下使用apachespark。我的pom.xml和同一版本(spark-core\u2.10、spark-sql\u2.10和spark-hive\u2.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"); .
我现在没什么主意了,有人能提供其他建议吗?

eblbsuwk

eblbsuwk1#

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

djmepvbi

djmepvbi2#

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

有了它,我就能够利用配置单元查询和sparkapi编写针对代码的单元测试。

相关问题