本文講的是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文檔兩個連接: