HDP 上安装了 Hive3.1 和 Spark2, 提交 Spark 做业时,报找不到 Hive 中表的问题sql
可是查一了下 hive 表,明明是存在这个表的。查看日志,注意到以下的一段日志。shell
没修改值以前,我在 Spark-shell 里建立了一张 hive 表,发现其建立的位置是 spark.sql.warehouse.dir 指向的目录,不在 hive.metastore.warehouse.dir 目录里 (其实这个值在 hive 中的配置,可是 spark 的 conf 下的目录里没有配置)。我在 spark 的 conf 目录里增长了 hive.metastore.warehouse.dir 的值,使其与 hive 中配置的值同样。但是我修改后,在 spark-shell 里查寻表时,依然显示是刚才建立的表。我把 spark.sql.warehouse.dir 的值也改为 hive.metastore.warehouse.dir 的值,仍然如此。session
网上的另外几种方法:app
1. 把 hive-site.xml 复制到 Spark 的 conf 目录下。ui
我看了一下 spark 的 conf 目录,有 hive-site.xml 这个表的,并且从日志中也能够看到 spark 能找到 hive 的 thrift://datacenter2:9083 这个地址,说明没问题。spa
2. 建立 spark session 的时候要启用 hive。日志
val ss = SparkSession.builder().appName("统计").enableHiveSupport().getOrCreate()
个人程序里有启用的,因此也不是缘由。code
3. 关闭 Hive 3 中的默认的 ACID 功能,修改以下几个参数xml
hive.strict.managed.tables=false hive.create.as.insert.only=false metastore.create.as.acid=false
试过以后,问题依旧。blog
崩溃了,找不到其它解决方法了。先记录一下。
================================================
有别的事,先作别的了。过了2天,抱着试试看的态度,在 /etc/spark2/3.1.0.0-78/0 下建了个软连接到 /etc/hive/conf 下的 hive-site.xml ,居然找获得表了。经过比较,发现原 spark 下的 hive-site.xml 里多了一个 metastore.catalog.default 的配置,值是 spark。在网上搜了一下,才知道要改为 hive 才能够读 hive 下建立的表。这个值我理解的是表示hive仓库的命名空间。为何 Spark 没有默认设置成 hive 的 catalog 的呢? 由于 HDP 3.1 中的 hive 会默认开启 ACID,spark 读取 ACID 的 表时,会出错,因此设置了一个 spark 的 catalog。