外部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="">
使用
spark.sql.hive.metastore.jars
設置為maven
而且spark.sql.hive.metastore.version
來匹配你的亞轉移瘤。當集群運行時,搜索驅動日誌,找到如下一行:
17/11/1822:41:19信息IsolatedClientLoader:下載metastore罐子來<路徑>
的目錄
<路徑>
是在集群的驅動節點中下載的jar的位置。或者,你也可以在Scala筆記本中運行以下代碼來打印jar的位置:
進口com.類型安全.配置.ConfigFactory瓦爾路徑=ConfigFactory.負載()。getString(“java.io.tmpdir”)println(\nHive jar被下載到以下路徑:$路徑\ n”)
運行
% shcp- r<路徑>/ dbfs hive_metastore_jar
(替換<路徑>
將此目錄複製到DBFS根目錄中名為hive_metastore_jar
通過DBFS客戶端在驅動節點。創建一個<一個class="reference internal" href="//m.eheci.com/docs/clusters/init-scripts.html">init腳本複製
/ dbfs hive_metastore_jar
到節點的本地文件係統,確保init腳本在訪問DBFS客戶端之前休眠幾秒鍾。這確保客戶端已經準備好了。集
spark.sql.hive.metastore.jars
使用此目錄。如果初始化腳本複製/ dbfs hive_metastore_jar
來/磚/ hive_metastore_jars /
,設置spark.sql.hive.metastore.jars
來/磚/ hive_metastore_jars / *
.位置必須包括拖尾/*
.重新啟動集群。
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.credentialsType
來AssumeRole
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:
單擊集群按鈕。
點擊創建集群.
輸入以下內容<一個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 >中的說明繼續群集配置<一個class="reference internal" href="//m.eheci.com/docs/clusters/configure.html">配置集群.
點擊創建集群創建集群。
使用初始化腳本設置外部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="">
創建要存儲初始化腳本的基本目錄(如果不存在)。下麵的示例使用
dbfs: /磚/腳本
.在筆記本中運行以下代碼片段。代碼片段創建初始化腳本
/磚/腳本/ 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
文件。
dbutils.fs.把(“磚/腳本/ 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”“”dbutils.fs.把(文件=“磚/腳本/ external-metastore.sh”,內容=內容,覆蓋=真正的)
使用init腳本配置您的集群。
重新啟動集群。
遠程模式<一個class="headerlink" href="//m.eheci.com/docs/data/metastores/#remote-mode" title="">
創建要存儲初始化腳本的基本目錄(如果不存在)。下麵的示例使用
dbfs: /磚/腳本
.在筆記本中運行以下代碼片段:
dbutils.fs.把(“磚/腳本/ 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”“”dbutils.fs.把(文件=“磚/腳本/ external-metastore.sh”,內容=內容,覆蓋=真正的)使用init腳本配置您的集群。
重新啟動集群。
故障排除<一個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
完整異常堆棧跟蹤中的錯誤消息模式:
引起的通過:javax.jdo.JDOFatalDataStoreException:不能來開放一個測驗連接來的鑒於數據庫.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.DatatypeFactory=com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl-Djavax.xml.validation.SchemaFactory: https://www.w3.org/2001/XMLSchema=com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory-Dorg.xml.sax.driver=com.sun.org.apache.xerces.internal.parsers.SAXParser-Dorg.w3c.dom.DOMImplementationSourceList=com.sun.org.apache.xerces.internal.dom.DOMXSImplementationSourceImpl