本文讲的是spark-sql
这个命令行工具读取hive数据的状况:html
刚开始熟悉Spark与hive3.x的交互,搜索了一番没有找到解决方案,大都是说把hive-site.xml拷贝到spark目录下,实际上个人集群安装时这个是自动进行的,能够看到spark的conf下已经有hive-site.xml文件了。sql
INFO HiveUtils: Initializing HiveMetastoreConnection version 3.0 using file
INFO HiveConf: Found configuration file file:/xxx/hdp/current/spark2/conf/hive-site.xml
INFO HiveClientImpl: Warehouse location for Hive client (version 3.0.0) is /apps/spark/warehouse
INFO HiveMetaStoreClient: Opened a connection to metastore, current connections: 1
INFO HiveMetaStoreClient: Connected to metastore.
复制代码
此时spark-sql是正常启动的,有配置文件且显示正常链接到了hive metastore,关键词有:shell
这时在命令行输入show databases;
并执行,结果以下: 数据库
结果中只有default数据库,并没有其余hive中已建立好的数据库,读取并处理更无从谈起。而指望是能显示hive中的其余多个数据库名称。apache
注意到启动过程当中打印的消息,INFO HiveConf: Found configuration file file:/xxx/hdp/current/spark2/conf/hive-site.xml
,这里提到了一个hive的配置文件,检查配置文件的内容:安全
注意INFO的信息:HiveMetastoreConnection version 3.0
,相关提示都是说版本为hive3.x,根据小伙伴的反映,在以前hive2.x版本时spark-sql读取hive的数据表毫无障碍,所以待考证是版本升级的变更!bash
仍是拷贝,可是Ambari用户安装集群时hive-site.xml是已经在spark里存在的,而且以前hive低版本不存在该问题,可能使人困惑。app
show databases;
(可能还有root
或spark
用户权限问题) 可以正常显示我在hive中建立的其余数据库了。直接修改如下三项为:工具
<property>
<name>hive.server2.thrift.http.port</name>
<value>10001</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<name>metastore.catalog.default</name>
<value>hive</value>
</property>
复制代码
spark使用与hive同样的thrift和metastore就能够了。性能
2019-10-11补充: Hive在HDP-3.0中引入了重大改进,包括性能和安全性改进以及ACID适用性。Spark没法读取或写入ACID表,所以为了适应这些改进,引入了Hive catalogs和Hive Warehouse Connector(HWC)。
补充Spark读取不了hive内部表数据的缘由:
HDP3.0 集成了hive 3.0和 spark 2.3.1,spark读取不了hive表的数据,准确来讲是内表(hive管理表)的数据。
hive 3.0以后默认开启ACID功能,并且新建的内表默认是ACID表(hive事务表)。而spark目前还不支持hive的ACID功能,所以没法读取ACID表的数据。
参考Spark Issue:SPARK-15348 Hive ACID
临时应对以下, 修改Hive如下参数让新建的表默认不是acid表。
hive.strict.managed.tables=false
hive.create.as.insert.only=false
metastore.create.as.acid=false
复制代码
这对已存在的内部表无效!
HDP文档的解决方案:
经@YangGod同窗指点,官网给出的一种解决方案是使用
Hive Warehouse Connector
,但这个方案应该也不是很完美,有试过的同窗能够说一下好很差用。
HDP文档两个连接: