外部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="">

  1. 創建一個集群spark.sql.hive.metastore.jars設置為mavenspark.sql.hive.metastore.version你的metastore匹配版本。

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

    17/11/1822:41:19信息IsolatedClientLoader:下載metastore罐子<路徑>

    的目錄<路徑>是司機的位置下載jar節點的集群。

    或者您可以運行下麵的代碼在一個Scala筆記本印刷罐的位置:

    進口com類型安全配置ConfigFactory瓦爾路徑=ConfigFactory負載()。getString(“java.io.tmpdir”)println(s \ nHive下載jar的路徑:美元路徑\ n”)
  3. 運行% shcp- r<路徑>/ dbfs hive_metastore_jar(替換<路徑>集群的信息)將這個目錄複製到目錄DBFS調用hive_metastore_jar通過FUSE客戶機驅動程序節點。

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

  5. spark.sql.hive.metastore.jars使用這個目錄。如果你的init腳本拷貝/ dbfs hive_metastore_jar/磚/ hive_metastore_jars /,設置spark.sql.hive.metastore.jars/磚/ hive_metastore_jars / *。位置必須包括拖曳/ *

  6. 重新啟動集群。

蜂巢的配置選項<一個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.credentialsTypeAssumeRole

  • 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使用磚界麵:

  1. 單擊集群按鈕欄。

  2. 點擊創建集群

  3. 輸入以下<一個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 >
  4. 繼續你的集群配置,下麵的指令<一個class="reference internal" href="//www.eheci.com/docs/docs/clusters/configure.html">配置集群

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

建立一個外部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="">

  1. 創建基礎要存儲目錄中的init腳本如果它不存在。下麵的示例使用dbfs: /磚/腳本

  2. 運行以下代碼片段在一個筆記本上。代碼片段創建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文件。

dbutilsfs(“磚/腳本/ 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”“”dbutilsfs(文件=“磚/腳本/ external-metastore.sh”,內容=內容,覆蓋=真正的)
  1. 用init腳本配置集群。

  2. 重新啟動集群。

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

  1. 創建基礎要存儲目錄中的init腳本如果它不存在。下麵的示例使用dbfs: /磚/腳本

  2. 在筆記本上運行下麵的代碼片段:

    dbutilsfs(“磚/腳本/ 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”“”dbutilsfs(文件=“磚/腳本/ external-metastore.sh”,內容=內容,覆蓋=真正的)
  3. 用init腳本配置集群。

  4. 重新啟動集群。

故障排除<一個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

  • 錯誤消息模式在整個異常堆棧跟蹤:

    引起的通過:javaxjdoJDOFatalDataStoreException:不能開放一個測試連接鑒於數據庫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.extraJavaOptionsspark.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