外部Apache Hive亞穩態<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#external-apache-hive-metastore" title="">

本文介紹如何設置Databricks集群以連接到現有的外部Apache Hive亞存儲。它提供了有關metastore部署模式、推薦的網絡設置和集群配置要求的信息,然後是配置集群以連接到外部metastore的說明。下表總結了每個Databricks Runtime版本中支持的Hive metastore版本。

Databricks on穀歌Cloud支持Databricks Runtime 7.3及以上版本。

Databricks運行時版本

0.13 - 1.2.1

2.0

2.1

2.2

2.3

3.1.0

7.倍

是的

是的

是的

是的

是的

是的

重要的

  • SQL Server不能作為Hive 2.0及以上版本的底層metastore數據庫。

  • 的值。如果使用Azure Database for MySQL作為外部metastore,則必須更改lower_case_table_names屬性在服務器端數據庫配置中從1(默認值)到2。詳細信息請參見<一個class="reference external" href="https://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html">區分大小寫

Hive metastore部署模式<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#hive-metastore-deployment-modes" title="">

在生產環境中,可以通過本地和遠程兩種方式部署Hive metastore。

本地模式

運行在集群內部的metastore客戶端通過JDBC直接連接到底層的metastore數據庫。

遠程模式

metastore客戶端不是直接連接到底層數據庫,而是通過Thrift協議連接到一個單獨的metastore服務。metastore服務連接到底層數據庫。在遠程模式下運行metastore時,DBFS是不支持

有關這些部署模式的詳細介紹,請參見<一個class="reference external" href="https://cwiki.apache.org/confluence/display/Hive/AdminManual+Metastore+Administration">蜂巢的文檔

請注意

本文檔中的示例使用MySQL作為底層metastore數據庫。

網絡設置<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#network-setup" title="">

數據集群運行在VPC內部。我們建議您在新的VPC中建立外部的Hive metastore,然後對這兩個VPC進行對等,使集群通過私有IP地址連接到Hive metastore。_提供了如何對Databricks集群使用的VPC和metastore所在的VPC進行對等的詳細說明。在對等VPC完成後,您可以在筆記本中執行以下命令,測試集群到metastore VPC的網絡連通性:

%sh nc -vz  <端口>

在哪裏

  • < DNS的名字私人IP >MySQL數據庫(本地模式)或metastore服務(遠程模式)的DNS名稱或私有IP地址。如果此處使用DNS名稱,請確保解析的IP地址為私有IP地址。

  • <口>是MySQL數據庫的端口或metastore服務的端口。

集群配置<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#cluster-configurations" title="">

您必須設置三組配置選項來連接集群到外部metastore:

  • 火花選項使用Hive metastore版本配置Spark,並為metastore客戶端配置jar。

  • 蜂巢的選項配置metastore客戶端連接到外部metastore。

Spark配置選項<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#spark-configuration-options" title="">

spark.sql.hive.metastore.version你的蜂巢亞穩態版本spark.sql.hive.metastore.jars如下:

  • Hive 0.13:不設置spark.sql.hive.metastore.jars

    請注意

    Hive 1.2.0和1.2.1不是Databricks Runtime 7.0及以上版本的內置metastore。如果您想使用Hive 1.2.0或1.2.1 with Databricks Runtime 7.0及以上版本,請按照以下步驟操作<一個class="reference internal" href="//www.eheci.com/docs.gcp/data/metastores/#download-the-metastore-jars-and-point-to-them">下載亞metastore罐子並指向它們

  • Hive 2.3.7 (Databricks Runtime 7.0 - 9.x)或Hive 2.3.9 (Databricks Runtime 10.0及以上):設置spark.sql.hive.metastore.jars內裝式

  • 對於所有其他版本的Hive, Databricks建議您下載metastore jar並設置配置spark.sql.hive.metastore.jars中描述的過程指向下載的jar<一個class="reference internal" href="//www.eheci.com/docs.gcp/data/metastores/#download-the-metastore-jars-and-point-to-them">下載亞metastore罐子並指向它們

下載亞metastore罐子並指向它們<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#download-the-metastore-jars-and-point-to-them" title="">

  1. 使用spark.sql.hive.metastore.jars設置為maven而且spark.sql.hive.metastore.version來匹配你的亞轉移瘤。

  2. 當集群運行時,搜索驅動日誌,找到如下一行:

    17/11/18224119信息IsolatedClientLoader下載metastore罐子<路徑>

    的目錄<路徑>是在集群的驅動節點中下載的jar的位置。

    或者,你也可以在Scala筆記本中運行以下代碼來打印jar的位置:

    進口com類型安全配置ConfigFactory瓦爾路徑ConfigFactory負載()。getString“java.io.tmpdir”println\nHive jar被下載到以下路徑:路徑\ n”
  3. 運行% shcp- r<路徑>/ dbfs hive_metastore_jar(替換<路徑>將此目錄複製到DBFS根目錄中名為hive_metastore_jar通過DBFS客戶端在驅動節點。

  4. 創建一個<一個class="reference internal" href="//www.eheci.com/docs.gcp/docs.gcp/clusters/init-scripts.html">init腳本複製/ dbfs hive_metastore_jar到節點的本地文件係統,確保init腳本在訪問DBFS客戶端之前休眠幾秒鍾。這確保客戶端已經準備好了。

  5. spark.sql.hive.metastore.jars使用此目錄。如果初始化腳本複製/ dbfs hive_metastore_jar/磚/ hive_metastore_jars /,設置spark.sql.hive.metastore.jars/磚/ hive_metastore_jars / *.位置必須包括拖尾/*

  6. 重新啟動集群。

Hive配置選項<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#hive-configuration-options" title="">

本節介紹Hive特有的選項。

使用UI設置外部metastore<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#set-up-an-external-metastore-using-the-ui" title="">

使用Databricks UI設置外部metastore:

  1. 單擊集群按鈕。

  2. 點擊創建集群

  3. 輸入以下內容<一個class="reference internal" href="//www.eheci.com/docs.gcp/docs.gcp/clusters/configure.html">Spark配置選項

    本地模式

    # Hive特定的配置選項。#火花。添加hadoop前綴以確保這些Hive特定的選項將傳播到metastore客戶端。spark.hadoop.javax.jdo.option.ConnectionURL jdbc: mysql: / / < mysql-host >: < mysql-port > / < metastore-db ># JDBC metastore的驅動程序類名(運行時3.4及更高版本)spark.hadoop.javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver# JDBC metastore的驅動程序類名(在運行時3.4之前)# spark.hadoop.javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driverspark.hadoop.javax.jdo.option.ConnectionUserName < mysql-username >spark.hadoop.javax.jdo.option.ConnectionPassword < mysql-password ># Spark特定的配置選項spark.sql.hive.metastore.version < hive-version >如果是0.13.x,則跳過此操作。spark.sql.hive.metastore.jars < hive-jar-source >

    遠程模式

    # Hive特定的配置選項#火花。添加hadoop前綴以確保這些Hive特定的選項將傳播到metastore客戶端。spark.hadoop.hive.metastore.uris節儉:/ / < metastore-host >: < metastore-port ># Spark特定的配置選項spark.sql.hive.metastore.version < hive-version >如果是0.13.x,則跳過此操作。spark.sql.hive.metastore.jars < hive-jar-source >
  4. 中的說明繼續群集配置<一個class="reference internal" href="//www.eheci.com/docs.gcp/docs.gcp/clusters/configure.html">配置集群

  5. 點擊創建集群創建集群。

使用初始化腳本設置外部metastore<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#set-up-an-external-metastore-using-an-init-script" title="">

Init腳本讓您連接到現有的Hive metastore,而無需手動設置所需的配置。

本地模式<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#local-mode" title="">

  1. 創建要存儲初始化腳本的基本目錄(如果不存在)。下麵的示例使用dbfs: /磚/腳本

  2. 在筆記本中運行以下代碼片段。代碼片段創建初始化腳本/磚/腳本/ external-metastore.sh在<一個class="reference internal" href="//www.eheci.com/docs.gcp/docs.gcp/dbfs/index.html">數據庫文件係統(DBFS).此init腳本將所需的配置選項寫入名為00-custom-spark.conf下的json格式/ / conf /磚/驅動程序在集群的每個節點內部。Databricks提供Spark的默認配置/ / conf / spark-branch.conf磚/驅動程序文件。配置文件/ conf /磚/驅動程序目錄按字母順序倒序排列。如果要更改名稱00-custom-spark.conf文件,確保它繼續適用之前spark-branch.conf文件。

    dbutilsfs“磚/腳本/ external-metastore.sh”" " # !/bin/sh|#加載環境變量以確定要使用的正確JDBC驅動程序。|來源/etc/environment|#用單引號引用標簽(即EOF)以禁用變量插值。貓| < < EOF的> / conf / 00-custom-spark.conf /磚/驅動程序|(司機){| #本地模式下的metastores的Hive特定配置選項。| #火花。添加hadoop前綴以確保這些Hive特定的選項將傳播到metastore客戶端。|“spark.hadoop.javax.jdo.option。ConnectionURL" = "jdbc:mysql://:/"|“spark.hadoop.javax.jdo.option。ConnectionUserName" = ""|“spark.hadoop.javax.jdo.option。ConnectionPassword" = ""|| # Spark特定的配置選項|“spark.sql.hive.metastore。Version " = ""如果是0.13.x,則跳過此操作。|“spark.sql.hive.metastore。Jars " = ""|| EOF||case "$DATABRICKS_RUNTIME_VERSION" in| " ")|司機= " com.mysql.jdbc.Driver "|;;| *)|司機= " org.mariadb.jdbc.Driver "|;;| esac|#單獨添加JDBC驅動程序,因為必須使用變量展開來選擇正確的|#驅動版本。|cat << EOF >> /databricks/driver/conf/00-custom-spark.conf|“spark.hadoop.javax.jdo.option。ConnectionDriverName" = "$DRIVER"|}| EOF|”“”stripMargin覆蓋真正的
  3. 使用init腳本配置您的集群。

  4. 重新啟動集群。

遠程模式<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#remote-mode" title="">

  1. 創建要存儲初始化腳本的基本目錄(如果不存在)。下麵的示例使用dbfs: /磚/腳本

  2. 在筆記本中運行以下代碼片段:

    dbutilsfs“磚/腳本/ external-metastore.sh”" " # !/bin/sh||#用單引號引用標簽(即EOF)以禁用變量插值。貓| < < EOF的> / conf / 00-custom-spark.conf /磚/驅動程序|(司機){| #蜂窩特定的配置選項的亞metastores遠程模式。| #火花。添加hadoop前綴以確保這些Hive特定的選項將傳播到metastore客戶端。|“spark.hadoop.hive.metastore。Uris " = "thrift://:"|| # Spark特定的配置選項|“spark.sql.hive.metastore。Version " = ""如果是0.13.x,則跳過此操作。|“spark.sql.hive.metastore。Jars " = ""|| #如果您需要使用假設角色,取消以下設置的注釋。“spark.hadoop.fs.s3a”。credentialsType" = "假設角色"| # "spark.hadoop.fs.s3a. stsassumption . ole. "Arn " = ""|}| EOF|”“”stripMargin覆蓋真正的
  3. 使用init腳本配置您的集群。

  4. 重新啟動集群。

故障排除<一個class="headerlink" href="//www.eheci.com/docs.gcp/data/metastores/#troubleshooting" title="">

集群無法啟動(由於初始化腳本設置不正確)

如果設置外部metastore的init腳本導致集群創建失敗,請將init腳本配置為<一個class="reference internal" href="//www.eheci.com/docs.gcp/docs.gcp/clusters/init-scripts.html">日誌,並使用日誌調試init腳本。

SQL語句錯誤:InvocationTargetException

  • 完整異常堆棧跟蹤中的錯誤消息模式:

    引起的通過javaxjdoJDOFatalDataStoreException不能開放一個測驗連接鑒於數據庫JDBCurl...

    外部metastore JDBC連接信息配置錯誤。驗證配置的主機名、端口、用戶名、密碼和JDBC驅動程序類名。另外,確保用戶名具有訪問metastore數據庫的權限。

  • 完整異常堆棧跟蹤中的錯誤消息模式:

    要求表格失蹤“星”目錄""模式""DataNucleus需要表格執行它的持久性操作...

    外部亞穩態數據庫未正確初始化。驗證您是否創建了metastore數據庫,並在JDBC連接字符串中放入了正確的數據庫名稱。然後,使用以下兩個Spark配置選項啟動一個新的集群:

    datanucleus.schema.autoCreateTables真實datanucleus.fixedDatastore假

    通過這種方式,Hive客戶端庫將嚐試在metastore數據庫中自動創建和初始化表,當它試圖訪問它們但發現它們不存在時。

SQL語句錯誤:AnalysisException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetastoreClient

完整異常stacktrace中的錯誤消息:

指定的數據存儲司機司機的名字發現類路徑

集群被配置為使用錯誤的JDBC驅動程序。

datanucleus設置。一個utoCreateSchema to true doesn’t work as expected

默認情況下,Databricks也會設置datanucleus.fixedDatastore真正的,這可以防止亞穩態數據庫發生任何意外的結構變化。因此,Hive客戶端庫不能創建亞礦表,即使您設置datanucleus.autoCreateSchema真正的.一般來說,這種策略對於生產環境更安全,因為它可以防止metastore數據庫意外升級。

如果你想用的話datanucleus.autoCreateSchema要幫助初始化metastore數據庫,請確保設置了datanucleus.fixedDatastore.此外,您可能希望在初始化metastore數據庫後翻轉這兩個標誌,以便為生產環境提供更好的保護。