我在嵌入式本地模式下使用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");
.
我现在没什么主意了,有人能提供其他建议吗?
2条答案
按热度按时间eblbsuwk1#
因为您在本地嵌入式模式下运行,所以不考虑hdfs。这就是为什么错误说
file:/user/hive/warehouse/test
而不是hdfs://localhost:9000/user/hive/warehouse/test
. 它期望/user/hive/warehouse/test
存在于本地计算机上。尝试在本地创建。djmepvbi2#
为了防止将来对其他人有所帮助,我正在尝试针对使用hivecontext的spark代码编写一些单元测试。我发现,为了更改为测试编写文件的路径,我需要调用hivecontext.setconf。我也尝试了与op相同的方法,执行
SET
但那没用。下面的方法似乎有效!为了让它更有用,我特别将这个路径设置为代码可以访问的位置:
有了它,我就能够利用配置单元查询和sparkapi编写针对代码的单元测试。