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

本文介紹如何設置Databricks集群以連接到現有的外部Apache Hive亞存儲。它提供了有關metastore部署模式、推薦的網絡設置和集群配置要求的信息,然後是配置集群以連接到外部metastore的說明。Databricks Runtime中包含的Hive庫版本請參考Databricks Runtime版本<一個class="reference internal" href="//m.eheci.com/docs/release-notes/runtime/index.html">發布說明

重要的

  • 的值。如果使用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">區分大小寫

  • 如果您使用隻讀的亞存儲數據庫,Databricks強烈建議您設置spark.databricks.delta.catalog.update.enabled以獲得更好的性能。

Hive metastore部署模式<一個class="headerlink" href="//m.eheci.com/docs/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="//m.eheci.com/docs/data/metastores/#network-setup" title="">

數據集群運行在VPC內部。我們建議您在新的VPC中建立外部的Hive metastore,然後對這兩個VPC進行對等,使集群通過私有IP地址連接到Hive metastore。<一個class="reference internal" href="//m.eheci.com/docs/administration-guide/cloud-configurations/aws/vpc-peering.html">VPC凝視提供了如何對Databricks集群使用的VPC和metastore所在的VPC進行對等的詳細說明。在對等VPC完成後,您可以在筆記本中執行以下命令,測試集群到metastore VPC的網絡連通性:

%sh nc -vz  <端口>

在哪裏

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

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

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

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

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

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

  • 一組可選的<一個class="reference internal" href="//m.eheci.com/docs/data/metastores/#file-options">Hadoop的選項配置文件係統選項

Spark配置選項<一個class="headerlink" href="//m.eheci.com/docs/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="//m.eheci.com/docs/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="//m.eheci.com/docs/data/metastores/#download-the-metastore-jars-and-point-to-them">下載亞metastore罐子並指向它們

下載亞metastore罐子並指向它們<一個class="headerlink" href="//m.eheci.com/docs/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="//m.eheci.com/docs/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="//m.eheci.com/docs/data/metastores/#hive-configuration-options" title="">

本節介紹Hive特有的選項。

本地模式的配置選項<一個class="headerlink" href="//m.eheci.com/docs/data/metastores/#configuration-options-for-local-mode" title="">

通過本地模式連接外部metastore,需要設置以下Hive配置選項:

# JDBC連接字符串javax.jdo.option.ConnectionURL jdbc: mysql: / / < metastore-host >: < metastore-port > / < metastore-db >#用於metastore數據庫的用戶名javax.jdo.option.ConnectionUserName < mysql-username >#用於metastore數據庫的密碼javax.jdo.option.ConnectionPassword < mysql-password ># JDBC metastore的驅動程序類名(運行時3.4及更高版本)javax.jdo.option.ConnectionDriverName org.mariadb.jdbc.Driver# JDBC metastore的驅動程序類名(在運行時3.4之前)# javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver

在哪裏

  • < metastore-host >而且< metastore-port >是MySQL實例的主機和監聽端口。

  • < metastore-db >是保存所有亞礦表的MySQL數據庫的名稱。

  • < mysql-username >而且< mysql-password >請指定具有讀寫權限的MySQL帳戶的用戶名和密碼< metastore-db >

請注意

  • 使用MariaDB驅動程序與MySQL數據庫通信。

  • 對於生產環境,我們建議您設置hive.metastore.schema.verification真正的.這可以防止Hive metastore客戶端在metastore客戶端版本與metastore數據庫版本不匹配時隱式修改metastore數據庫模式。當對低於Hive 1.2.0版本的metastore客戶端啟用此設置時,請確保該metastore客戶端具有對metastore數據庫的寫權限(以防止本文中描述的問題)<一個class="reference external" href="https://issues.apache.org/jira/browse/HIVE-9749">蜂巢- 9749).

    • 對於Hive metastore 1.2.0及以上版本,請設置hive.metastore.schema.verification.record.version真正的要啟用hive.metastore.schema.verification

    • 對於Hive亞metastore 2.1.1及以上,設置hive.metastore.schema.verification.record.version真正的因為它被設置為默認情況下。

遠程模式的配置選項<一個class="headerlink" href="//m.eheci.com/docs/data/metastores/#configuration-options-for-remote-mode" title="">

要使用遠程模式連接到外部metastore,請設置以下Hive配置選項:

#遠程metastore的Thrift URI。metastore客戶端用於連接遠端metastore。hive.metastore.uris節儉:/ / < metastore-host >: < metastore-port >

在哪裏< metastore-host >而且< metastore-port >是Hive metastore服務的監聽主機和端口。

文件係統選項<一個class="headerlink" href="//m.eheci.com/docs/data/metastores/#file-system-options" title="">

如果你想用an<一個class="reference internal" href="//m.eheci.com/docs/archive/admin-guide/assume-role.html">實例配置文件,並設置假設角色,你必須設置:

  • fs.s3a.credentialsTypeAssumeRole

  • fs.s3a.stsAssumeRole.arn到要承擔的角色的Amazon資源名(ARN)

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

使用Databricks UI設置外部metastore:

  1. 單擊集群按鈕。

  2. 點擊創建集群

  3. 輸入以下內容<一個class="reference internal" href="//m.eheci.com/docs/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 >#如果您需要使用假設角色,取消以下設置的注釋。# spark.hadoop.fs.s3a。credentialsType AssumeRole# spark.hadoop.fs.s3a.stsAssumeRole。是< sts-arn >

    遠程模式

    # 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 >#如果您需要使用假設角色,取消以下設置的注釋。# spark.hadoop.fs.s3a。credentialsType AssumeRole# spark.hadoop.fs.s3a.stsAssumeRole。是< sts-arn >
  4. 中的說明繼續群集配置<一個class="reference internal" href="//m.eheci.com/docs/clusters/configure.html">配置集群

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

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

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

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

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

  2. 在筆記本中運行以下代碼片段。代碼片段創建初始化腳本/磚/腳本/ external-metastore.sh在<一個class="reference internal" href="//m.eheci.com/docs/dbfs/index.html">數據庫文件係統(DBFS).或者,您可以使用<一個class="reference internal" href="//m.eheci.com/docs/dev-tools/api/latest/dbfs.html">DBFS REST API放操作創建初始化腳本。此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 " = ""|| #如果您需要使用假設角色,取消以下設置的注釋。“spark.hadoop.fs.s3a”。credentialsType" = "假設角色"| # "spark.hadoop.fs.s3a. stsassumption . ole. "Arn " = ""| 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覆蓋真正的
內容" " # !/bin/sh#加載環境變量以確定要使用的正確JDBC驅動程序。源/etc/environment#用單引號引用標簽(即EOF)以禁用變量插值。貓< < EOF的> / conf / 00-custom-spark.conf /磚/驅動程序(司機){#在本地模式下為metastore配置特定的選項。#火花。添加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。罐子" = ""#如果您需要使用假設角色,取消以下設置的注釋。#“spark.hadoop.fs.s3a。credentialsType" = "假設角色"#“spark.hadoop.fs.s3a.stsAssumeRole。Arn " = ""EOFcase "$DATABRICKS_RUNTIME_VERSION"在" ")司機= " 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”“”dbutilsfs文件“磚/腳本/ external-metastore.sh”內容內容覆蓋真正的
  1. 使用init腳本配置您的集群。

  2. 重新啟動集群。

遠程模式<一個class="headerlink" href="//m.eheci.com/docs/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覆蓋真正的
    內容" " # !/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。罐子" = ""#如果您需要使用假設角色,取消以下設置的注釋。#“spark.hadoop.fs.s3a。credentialsType" = "假設角色"#“spark.hadoop.fs.s3a.stsAssumeRole。Arn " = ""EOF”“”dbutilsfs文件“磚/腳本/ external-metastore.sh”內容內容覆蓋真正的
  3. 使用init腳本配置您的集群。

  4. 重新啟動集群。

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

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

如果設置外部metastore的init腳本導致集群創建失敗,請將init腳本配置為<一個class="reference internal" href="//m.eheci.com/docs/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驅動程序。

如果將使用Runtime 3.4或更高版本的集群配置為使用MySQL而不是MariaDB驅動程序,則可能發生此錯誤。

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

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

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

amazonclientexception:無法初始化SAX驅動程序來創建XMLReader

如果集群的版本為2.1.1-db5,則可能引發此異常。此問題已在2.1.1-db6中修複。對於2.1.1-db5,可以通過設置以下JVM屬性作為的設置的一部分來修複此問題spark.driver.extraJavaOptions而且spark.executor.extraJavaOptions

-Djavax.xml.datatype.DatatypeFactorycom.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl-Djavax.xml.parsers.DocumentBuilderFactorycom.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl-Djavax.xml.parsers.SAXParserFactorycom.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl-Djavax.xml.validation.SchemaFactory: https://www.w3.org/2001/XMLSchemacom.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory-Dorg.xml.sax.drivercom.sun.org.apache.xerces.internal.parsers.SAXParser-Dorg.w3c.dom.DOMImplementationSourceListcom.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl