外部Apache蜂巢metastore<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#external-apache-hive-metastore" title="">
本文描述了如何設置磚Apache蜂巢metastores集群連接到現有的外部。metastore部署模式,它提供了信息推薦的網絡設置,和集群配置需求,其次是說明配置集群連接到外部metastore。下麵的表總結了蜂巢metastore版本支持在每個版本的磚運行時。
磚的運行時版本的 |
0.13 - 1.2.1 " |
2.0 |
2.1 |
2.2 |
2.3 |
3.1.0 |
---|---|---|---|---|---|---|
7.倍 |
是的 |
是的 |
是的 |
是的 |
是的 |
是的 |
6.倍 |
是的 |
是的 |
是的 |
是的 |
是的 |
是的 |
5.3及以上 |
是的 |
是的 |
是的 |
是的 |
是的 |
是的 |
5.1 - -5.2和4. x |
是的 |
是的 |
是的 |
是的 |
是的 |
沒有 |
3.倍 |
是的 |
是的 |
是的 |
沒有 |
沒有 |
沒有 |
2.1.1-db4 2.1.x的和更高版本 |
是的 |
是的 |
是的 |
沒有 |
沒有 |
沒有 |
低於2.1.1-db4 |
是的 |
沒有 |
沒有 |
沒有 |
沒有 |
沒有 |
重要的
如果你使用Azure為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">標識符區分大小寫一個>。如果你使用一個隻讀metastore數據庫,數據磚強烈建議您設置
spark.databricks.delta.catalog.update.enabled
來假
集群獲得更好的性能。
蜂巢metastore部署模式<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#hive-metastore-deployment-modes" title="">
在生產環境中,您可以在兩種模式:部署一個蜂巢metastore本地和遠程。
本地模式
metastore客戶機運行在集群底層metastore數據庫直接通過JDBC連接。
遠程模式
而不是直接連接到底層數據庫,metastore客戶機連接到一個單獨的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/data/metastores/#network-setup" title="">
磚集群運行在一個虛擬私有雲(VPC)。我們建議您設置外部蜂巢metastore內部一個新的VPC然後同行這兩個VPC集群連接到蜂巢metastore使用私有IP地址。<一個class="reference internal" href="//www.eheci.com/docs/docs/administration-guide/cloud-configurations/aws/vpc-peering.html">VPC凝視提供詳細說明如何同行使用的VPC磚集群和VPC metastore生活的地方。凝視VPC之後,您可以測試網絡連接從一個集群metastore VPC通過運行以下命令在一個筆記本:
% sh數控vz < DNS名稱或私人IP > <口>
在哪裏
< DNS的名字或私人IP >
DNS名稱或MySQL數據庫的私有IP地址(本地模式)或metastore服務(用於遠程模式)。如果你使用一個DNS名稱,確保解決IP地址是私人的。<口>
MySQL數據庫的港口或港口metastore服務。
集群配置<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#cluster-configurations" title="">
必須設置三套集群配置選項來連接到外部metastore:
火花選項配置火花的蜂巢metastore版本和jar metastore客戶機。
蜂巢的選項配置metastore客戶機連接到外部metastore。
一個可選的<一個class="reference internal" href="//www.eheci.com/docs/data/metastores/#file-options">Hadoop的選項配置文件係統選項。
火花配置選項<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#spark-configuration-options" title="">
集spark.sql.hive.metastore.version
版本的蜂巢metastore和spark.sql.hive.metastore.jars
如下:
蜂巢0.13:不設置
spark.sql.hive.metastore.jars
。蜂巢1.2.0或1.2.1(磚運行時的6.6及以下):集
spark.sql.hive.metastore.jars
來內裝式
。請注意
蜂巢1.2.0和1.2.1不是內置metastore磚運行時7.0及以上。如果你想使用Hive 1.2.0或1.2.1磚運行時7.0及以上的,按照描述的過程<一個class="reference internal" href="//www.eheci.com/docs/data/metastores/#download-the-metastore-jars-and-point-to-them">下載metastore罐子,指向他們。
蜂巢2.3.7(磚運行時7.0 - 9. x)或蜂巢2.3.9(磚運行時的10.0及以上):集
spark.sql.hive.metastore.jars
來內裝式
。對於所有其他蜂巢版本,磚建議您下載metastore罐子和設置配置
spark.sql.hive.metastore.jars
指使用中描述的程序下載的jar<一個class="reference internal" href="//www.eheci.com/docs/data/metastores/#download-the-metastore-jars-and-point-to-them">下載metastore罐子,指向他們。
下載metastore罐子,指向他們<一個class="headerlink" href="//www.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
你的metastore匹配版本。當集群運行時,搜索驅動程序日誌,找到一條線如下:
17/11/1822:41:19信息IsolatedClientLoader:下載metastore罐子來<路徑>
的目錄
<路徑>
是司機的位置下載jar節點的集群。或者您可以運行下麵的代碼在一個Scala筆記本印刷罐的位置:
進口com。類型安全。配置。ConfigFactory瓦爾路徑=ConfigFactory。負載()。getString(“java.io.tmpdir”)println(s \ nHive下載jar的路徑:美元路徑\ n”)
運行
% shcp- r<路徑>/ dbfs hive_metastore_jar
(替換<路徑>
集群的信息)將這個目錄複製到目錄DBFS調用hive_metastore_jar
通過FUSE客戶機驅動程序節點。創建一個<一個class="reference internal" href="//www.eheci.com/docs/docs/clusters/init-scripts.html">init腳本複製
/ dbfs hive_metastore_jar
節點的本地文件係統,確保使init腳本睡眠幾秒鍾之前訪問DBFS FUSE客戶機。這將確保客戶已經準備好了。集
spark.sql.hive.metastore.jars
使用這個目錄。如果你的init腳本拷貝/ dbfs hive_metastore_jar
來/磚/ hive_metastore_jars /
,設置spark.sql.hive.metastore.jars
來/磚/ hive_metastore_jars / *
。位置必須包括拖曳/ *
。重新啟動集群。
蜂巢的配置選項<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#hive-configuration-options" title="">
本節描述特定於蜂巢選項。
為當地的模式配置選項<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#configuration-options-for-local-mode" title="">
連接到一個外部metastore使用本地模式,設置以下蜂巢配置選項:
#為JDBC metastore 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數據庫的名稱,保存所有的metastore表。< mysql-username >
和< mysql-password >
指定你的MySQL賬戶的用戶名和密碼,讀/寫訪問權< metastore-db >
。
請注意
使用MariaDB驅動程序與MySQL數據庫。
對於生產環境,我們建議您設置
hive.metastore.schema.verification
來真正的
。這可以防止蜂巢metastore端metastore時隱式地修改metastore數據庫模式客戶端版本不匹配metastore數據庫版本。當啟用此設置metastore客戶機版本低於蜂巢1.2.0,確保metastore端有寫權限metastore數據庫(防止中描述的問題<一個class="reference external" href="https://issues.apache.org/jira/browse/HIVE-9749">蜂巢- 9749一個>)。對蜂巢metastore 1.2.0越高,集
hive.metastore.schema.verification.record.version
來真正的
要啟用hive.metastore.schema.verification
。蜂巢metastore 2.1.1和高,集
hive.metastore.schema.verification.record.version
來真正的
因為它將假
默認情況下。
配置選項為遠程模式<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#configuration-options-for-remote-mode" title="">
連接到一個外部metastore使用遠程模式,設置以下蜂巢配置選項:
#遠程metastore節儉URI。遠程metastore metastore所使用的客戶端連接。hive.metastore。uri節儉:/ / < metastore-host >: < metastore-port >
在哪裏< metastore-host >
和< metastore-port >
是聽你的蜂巢metastore服務的主機和端口。
文件係統選項<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#file-system-options" title="">
如果你想使用一個<一個class="reference internal" href="//www.eheci.com/docs/docs/administration-guide/cloud-configurations/aws/assume-role.html">實例配置文件並設置AssumeRole,你必須設置:
fs.s3a.credentialsType
來AssumeRole
fs.s3a.stsAssumeRole.arn
亞馬遜資源名稱(攻擊)承擔的角色
建立一個外部metastore使用UI<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#set-up-an-external-metastore-using-the-ui" title="">
建立一個外部metastore使用磚界麵:
單擊集群按鈕欄。
點擊創建集群。
輸入以下<一個class="reference internal" href="//www.eheci.com/docs/docs/clusters/configure.html">火花配置選項:
本地模式
#蜂巢特定的配置選項。#火花。hadoop添加前綴,以確保這些蜂巢特定選項將傳播到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.sql.hive.metastore.version
#如果< hive-version >是0.13.x跳過這一個。spark.sql.hive.metastore.jars #如果你需要使用AssumeRole,取消注釋以下設置。# spark.hadoop.fs.s3a。credentialsType AssumeRole# spark.hadoop.fs.s3a.stsAssumeRole。是< sts-arn > 遠程模式
#蜂巢特定的配置選項#火花。hadoop添加前綴,以確保這些蜂巢特定選項將傳播到metastore客戶機。spark.hadoop.hive.metastore。uri節儉:/ / < metastore-host >: < metastore-port >#引發特定的配置選項spark.sql.hive.metastore.version
#如果< hive-version >是0.13.x跳過這一個。spark.sql.hive.metastore.jars #如果你需要使用AssumeRole,取消注釋以下設置。# spark.hadoop.fs.s3a。credentialsType AssumeRole# spark.hadoop.fs.s3a.stsAssumeRole。是< sts-arn > 繼續你的集群配置,下麵的指令<一個class="reference internal" href="//www.eheci.com/docs/docs/clusters/configure.html">配置集群。
點擊創建集群創建集群。
建立一個外部metastore使用init腳本<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#set-up-an-external-metastore-using-an-init-script" title="">
Init腳本讓你連接到一個現有的蜂巢metastore沒有手動設置所需的配置。
本地模式<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#local-mode" title="">
創建基礎要存儲目錄中的init腳本如果它不存在。下麵的示例使用
dbfs: /磚/腳本
。運行以下代碼片段在一個筆記本上。代碼片段創建init腳本
/磚/腳本/ external-metastore.sh
在<一個class="reference internal" href="//www.eheci.com/docs/docs/dbfs/index.html">磚文件係統(DBFS)。或者,您可以使用<一個class="reference internal" href="//www.eheci.com/docs/docs/dev-tools/api/latest/dbfs.html">DBFS REST API將操作創建初始化腳本。這個init腳本寫要求配置選項配置文件命名00-custom-spark.conf
類json格式/ / conf /磚/驅動程序
在每一個節點的集群。磚提供違約引發的配置/ / 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在本地模式下的具體配置選項。| #火花。hadoop添加前綴,以確保這些蜂巢特定選項將傳播到metastore客戶機。|“spark.hadoop.javax.jdo.option。ConnectionURL " = " jdbc: mysql: / / < mysql-host >: < mysql-port > / < metastore-db >”|“spark.hadoop.javax.jdo.option。ConnectionUserName " = " < mysql-username >”|“spark.hadoop.javax.jdo.option。ConnectionPassword " = " < mysql-password >”|| #引發特定的配置選項|“spark.sql.hive.metastore。版”=“< hive-version >”| #如果< hive-version >是0.13.x跳過這一個。|“spark.sql.hive.metastore。jar < hive-jar-source >“=|| #如果你需要使用AssumeRole,取消注釋以下設置。| #“spark.hadoop.fs.s3a。credentialsType AssumeRole“=| #“spark.hadoop.fs.s3a.stsAssumeRole。在攻擊" = " < sts-arn >”| EOF||“DATABRICKS_RUNTIME_VERSION美元”| " ")|司機= " com.mysql.jdbc.Driver "|;;| *)|司機= " org.mariadb.jdbc.Driver "|;;| esac| #以來分別添加JDBC驅動程序必須使用變量擴展選擇正確的| #驅動程序版本。貓| < < EOF > > / conf / 00-custom-spark.conf /磚/驅動程序|“spark.hadoop.javax.jdo.option。ConnectionDriverName " = " $司機”|}| EOF|”“”。stripMargin,覆蓋=真正的)
內容=" " # ! / bin / sh#負載環境變量來確定正確的JDBC驅動程序使用。源/etc/environment#引用標簽(EOF)禁用變量插值的單引號。貓< < EOF的> / conf / 00-custom-spark.conf /磚/驅動程序(司機){#蜂巢metastores在本地模式下的具體配置選項。#火花。hadoop添加前綴,以確保這些蜂巢特定選項將傳播到metastore客戶機。“spark.hadoop.javax.jdo.option。ConnectionURL " = " jdbc: mysql: / / < mysql-host >: < mysql-port > / < metastore-db >”“spark.hadoop.javax.jdo.option。ConnectionUserName " = " < mysql-username >”“spark.hadoop.javax.jdo.option。ConnectionPassword " = " < mysql-password >”#引發特定的配置選項“spark.sql.hive.metastore。版”=“< hive-version >”#如果< hive-version >是0.13.x跳過這一個。“spark.sql.hive.metastore。罐子" = "" #如果你需要使用AssumeRole,取消注釋以下設置。#“spark.hadoop.fs.s3a。credentialsType AssumeRole“=#“spark.hadoop.fs.s3a.stsAssumeRole。在攻擊" = " < sts-arn >”EOF“DATABRICKS_RUNTIME_VERSION美元”" ")司機= " com.mysql.jdbc.Driver ";;*)司機= " org.mariadb.jdbc.Driver ";;esac#添加JDBC驅動程序必須使用以來分別選擇正確的變量擴展#驅動程序版本。貓< < EOF > > / conf / 00-custom-spark.conf /磚/驅動程序“spark.hadoop.javax.jdo.option。ConnectionDriverName " = " $司機”}EOF”“”dbutils。fs。把(文件=“磚/腳本/ external-metastore.sh”,內容=內容,覆蓋=真正的)
用init腳本配置集群。
重新啟動集群。
遠程模式<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#remote-mode" title="">
創建基礎要存儲目錄中的init腳本如果它不存在。下麵的示例使用
dbfs: /磚/腳本
。在筆記本上運行下麵的代碼片段:
dbutils。fs。把(“磚/腳本/ external-metastore.sh”," " # ! / bin / sh|| #引用標簽(EOF)禁用變量插值的單引號。貓| < < EOF的> / conf / 00-custom-spark.conf /磚/驅動程序|(司機){| #蜂巢metastores在遠程模式下的具體配置選項。| #火花。hadoop添加前綴,以確保這些蜂巢特定選項將傳播到metastore客戶機。|“spark.hadoop.hive.metastore。uri”=“節儉:/ / < metastore-host >: < metastore-port >”|| #引發特定的配置選項|“spark.sql.hive.metastore。版”=“< hive-version >”| #如果< hive-version >是0.13.x跳過這一個。|“spark.sql.hive.metastore。jar < hive-jar-source >“=|| #如果你需要使用AssumeRole,取消注釋以下設置。| #“spark.hadoop.fs.s3a。credentialsType AssumeRole“=| #“spark.hadoop.fs.s3a.stsAssumeRole。在攻擊" = " < sts-arn >”|}| EOF|”“”。stripMargin,覆蓋=真正的)
內容=" " # ! / bin / sh#引用標簽(EOF)禁用變量插值的單引號。貓< < EOF的> / conf / 00-custom-spark.conf /磚/驅動程序(司機){#蜂巢metastores在遠程模式下的具體配置選項。#火花。hadoop添加前綴,以確保這些蜂巢特定選項將傳播到metastore客戶機。“spark.hadoop.hive.metastore。uri”=“節儉:/ / < metastore-host >: < metastore-port >”#引發特定的配置選項“spark.sql.hive.metastore。版”=“< hive-version >”#如果< hive-version >是0.13.x跳過這一個。“spark.sql.hive.metastore。罐子" = "
" #如果你需要使用AssumeRole,取消注釋以下設置。#“spark.hadoop.fs.s3a。credentialsType AssumeRole“=#“spark.hadoop.fs.s3a.stsAssumeRole。在攻擊" = " < sts-arn >”}EOF”“”dbutils。fs。把(文件=“磚/腳本/ external-metastore.sh”,內容=內容,覆蓋=真正的)用init腳本配置集群。
重新啟動集群。
故障排除<一個class="headerlink" href="//www.eheci.com/docs/data/metastores/#troubleshooting" title="">
集群不開始(由於不正確的初始化腳本設置)
如果一個init腳本設置外部metastore導致集群創建失敗,配置初始化腳本<一個class="reference internal" href="//www.eheci.com/docs/docs/clusters/init-scripts.html">日誌使用日誌和調試init腳本。
錯誤的SQL語句:InvocationTargetException
錯誤消息模式在整個異常堆棧跟蹤:
引起的通過:javax。jdo。JDOFatalDataStoreException:不能來開放一個測試連接來的鑒於數據庫。JDBCurl=(…]
外部metastore JDBC連接信息配置。驗證配置的主機名、端口、用戶名、密碼和JDBC驅動程序類名。同時,確保用戶名有權訪問metastore數據庫特權。
錯誤消息模式在整個異常堆棧跟蹤:
要求表失蹤:“星”在目錄”“模式”“。DataNucleus需要這表來執行它的持久性操作。(…]
外部metastore數據庫沒有正確初始化。確認您創建metastore數據庫,並把正確的數據庫名稱JDBC連接字符串。然後,開始一個新的集群使用以下兩個火花配置選項:
datanucleus.autoCreateSchema真正的datanucleus.fixedDatastore假
這樣,蜂巢客戶端庫將嚐試metastore數據庫中創建和初始化表自動當它試圖訪問他們,但他認為他們缺席。
錯誤的SQL語句:AnalysisException:無法實例化org.apache.hadoop.hive.metastore.HiveMetastoreClient
異常堆棧錯誤消息在完整的異常:
的指定的數據存儲司機(司機的名字)是不發現在的類路徑
集群配置為使用一個不正確的JDBC驅動程序。
這個錯誤可能發生如果集群使用運行時3.4或更高版本配置為使用MySQL而不是MariaDB司機。
datanucleus設置。一個utoCreateSchema to true doesn’t work as expected
默認情況下,磚還設置datanucleus.fixedDatastore
來真正的
,從而防止任何意外metastore數據庫結構的變化。因此,蜂巢客戶端庫不能創建metastore表即使你設置datanucleus.autoCreateSchema
來真正的
。這種策略是,在一般情況下,對生產環境更安全,因為它阻止了metastore數據庫不小心升級。
如果你想使用datanucleus.autoCreateSchema
來初始化metastore數據庫,確保您設置datanucleus.fixedDatastore
來假
。同樣,你可能想要翻兩旗後初始化metastore數據庫提供更好的保護您的生產環境。
com.amazonaws。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