Spark-SQL讀不到Hive數據庫的新坑指北

背景

本文講的是spark-sql這個命令行工具讀取hive數據的狀況:html

  • Spark是2.3.1,HDP發行版
  • Hive是3.1.0,HDP
  • SparkSQL和Hive3的交互問題,用Sparksql讀取處理hive中已存在的表數據但讀取不到hive的database
  • 順便,SparkSQL讀取不了hive內部表,能夠讀hive外表的數據,文末有解決方案

剛開始熟悉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

  • HiveMetastoreConnection version 3.0
  • Hive client (version 3.0.0)
  • Connected to metastore

這時在命令行輸入show databases;並執行,結果以下: 數據庫

問題

結果中只有default數據庫,並沒有其餘hive中已建立好的數據庫,讀取並處理更無從談起。而指望是能顯示hive中的其餘多個數據庫名稱。apache

解決方案

排查hive-site.xml

注意到啓動過程當中打印的消息,INFO HiveConf: Found configuration file file:/xxx/hdp/current/spark2/conf/hive-site.xml,這裏提到了一個hive的配置文件,檢查配置文件的內容:安全

注意到上述端口,與HiveServer實際使用的端口是不同的! 推測多是新版本的集成包中,spark採用了一套獨立的配置,於是能夠正常啓動,但讀取不到hive的數據庫。

版本提示

注意INFO的信息:HiveMetastoreConnection version 3.0,相關提示都是說版本爲hive3.x,根據小夥伴的反映,在以前hive2.x版本時spark-sql讀取hive的數據表毫無障礙,所以待考證是版本升級的變更!bash

實際解決(臨時方案)

直接拷貝hive的配置

  1. 將原spark裏的hive-site.xml備份或刪掉,將hive安裝目錄下的hive-site.xml拷貝到spark conf下

仍是拷貝,可是Ambari用戶安裝集羣時hive-site.xml是已經在spark裏存在的,而且以前hive低版本不存在該問題,可能使人困惑。app

  1. 再次啓動spark-sql,若是報tez相關的錯誤,則直接將hive-site.xml中全部tez的配置刪除便可!
  2. 正常啓動spark-sql,show databases;(可能還有rootspark用戶權限問題) 可以正常顯示我在hive中建立的其餘數據庫了。

或 修改spark自帶的hive-site.xml

直接修改如下三項爲:工具

<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就能夠了。性能

注意

  • 彷佛還有讀取hive內部表和外部表的問題(見後文補充)。

2019-10-11補充: Hive在HDP-3.0中引入了重大改進,包括性能和安全性改進以及ACID適用性。Spark沒法讀取或寫入ACID表,所以爲了適應這些改進,引入了Hive catalogs和Hive Warehouse Connector(HWC)。


重要補充!Spark讀取Hive3.0內表(2019-10-04)

補充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文檔兩個連接:

相關文章
相關標籤/搜索