外部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:
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="">
使用
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="//www.eheci.com/docs.gcp/docs.gcp/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="//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:
單擊集群按鈕。
點擊創建集群.
輸入以下內容<一個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 >中的說明繼續群集配置<一個class="reference internal" href="//www.eheci.com/docs.gcp/docs.gcp/clusters/configure.html">配置集群.
點擊創建集群創建集群。
使用初始化腳本設置外部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="">
創建要存儲初始化腳本的基本目錄(如果不存在)。下麵的示例使用
dbfs: /磚/腳本
.在筆記本中運行以下代碼片段。代碼片段創建初始化腳本
/磚/腳本/ 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
文件。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 " = "" || 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,覆蓋=真正的)使用init腳本配置您的集群。
重新啟動集群。
遠程模式<一個class="headerlink" href="//www.eheci.com/docs.gcp/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,覆蓋=真正的)使用init腳本配置您的集群。
重新啟動集群。
故障排除<一個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
完整異常堆棧跟蹤中的錯誤消息模式:
引起的通過: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驅動程序。
datanucleus設置。一個utoCreateSchema to true doesn’t work as expected
默認情況下,Databricks也會設置datanucleus.fixedDatastore
來真正的
,這可以防止亞穩態數據庫發生任何意外的結構變化。因此,Hive客戶端庫不能創建亞礦表,即使您設置datanucleus.autoCreateSchema
來真正的
.一般來說,這種策略對於生產環境更安全,因為它可以防止metastore數據庫意外升級。
如果你想用的話datanucleus.autoCreateSchema
要幫助初始化metastore數據庫,請確保設置了datanucleus.fixedDatastore
來假
.此外,您可能希望在初始化metastore數據庫後翻轉這兩個標誌,以便為生產環境提供更好的保護。