如何排除幾個Apache Hive亞穩態問題

了解如何排除Apache Hive metastore問題。

寫的亞當Pavlacka

最後發布日期:2022年5月16日

問題1:外部亞metastore表不可用

當您檢查驅動程序日誌時,您會看到包含錯誤的堆棧跟蹤所需表格缺失:

WARN查詢:查詢org.apache.hadoop.hive.metastore.model.MDatabase及其子類的候選項,結果沒有可能的候選項。DataNucleus需要這個表來執行它的持久性操作。要麼你的元數據是不正確的,要麼你需要啟用“datannucleus .schema”。autoCreateTables" org.datanucleus.store.rdbms.exceptions.MissingTableException:必需的表缺少:"DBS"在目錄"" Schema ""。DataNucleus需要這個表來執行它的持久性操作。要麼你的元數據是不正確的,要麼你需要啟用“datannucleus .schema”。autoCreateTables" at org.datanucleus.store.rdbms.table. abstractable .exists(abstractable .java:606) at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:33 85)

導致

數據庫是存在的,但是沒有亞metastore表。

解決方案

如果外部亞metastore版本為Hive 2.0或以上,請使用Hive架構工具創建亞metastore表。對於Hive 2.0以下的版本,在現有的init腳本中添加以下配置的metastore表:

spark.hadoop.datanucleus。autoCreateSchema = true spark.hadoop.datanucleus.fixedDatastore = false

您也可以在Apache中設置這些配置火花配置AWS|Azure)直接:

datanucleus。autoCreateSchema true datannuclear。fixedDatastore假

問題2:Hive metastore驗證失敗

當你檢查驅動日誌時,你會看到一個包含如下錯誤的堆棧跟蹤:

18/09/24 14:51:07 ERROR RetryingHMSHandler: HMSHandler致命錯誤:MetaException(message:Version information not found in metastore.)在org.apache.hadoop.hive.metastore.ObjectStore。checkSchema(ObjectStore .java:7564) at org.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore. java:7564)在sun.reflect.NativeMethodAccessorImpl。invoke0(本地方法)

導致

版本亞metastore中的表為空。

解決方案

做以下其中一件事:

  • 填充版本表中包含正確的版本值插入查詢
  • 在集群的Spark配置中,通過以下配置關閉metastore驗證:
    Hive.metastore.schema.verification .version false

問題3:超過Metastore連接限製

在集群上運行的命令失敗,驅動日誌中有如下堆棧跟蹤:

無法打開到給定數據庫的測試連接。JDBC url = JDBC:?trustServerCertificate=true& usess L=true, username = < reacted >。終止連接池(如果你希望在應用程序啟動後啟動數據庫,則將lazyInit設置為true)。原始異常:------ java.sql.SQLSyntaxErrorException: User '' has exceeded the 'max_user_connections' resource (current value: 100) at org.mariadb.jdbc.internal.util.exceptions.Except ionMapper.get(ExceptionMapper.java:163) at org.mariadb.jdbc.internal.util.exceptions.Except ionMapper.getException(ExceptionMapper.java:106) at org.mariadb.jdbc.internal.protocol. abstractconnection ctProtocol. Exception: User '' has exceeded the 'max_user_connections' resource (current value: 100)connectWithoutProxy (AbstractConnectPr otocol.java: 1036)

導致

metastore配置隻允許100個連接。當達到連接限製時,不允許新的連接,並且命令失敗並出現此錯誤。Databricks工作區中的每個集群都與metastore建立連接。如果有大量集群正在運行,則可能出現此問題。此外,不正確的配置可能導致連接泄漏,導致連接數量不斷增加,直到達到限製。

解決方案

通過以下操作之一糾正問題:

  • 如果您正在使用外部metastore,並且有大量集群正在運行,那麼請增加外部metastore上的連接限製。
  • 如果您不使用外部metastore,請確保您的集群上沒有任何自定義Hive metastore配置。當使用Databricks提供的metastore時,Hive metastore需要使用集群默認配置。
  • 如果您正在使用默認配置,但仍然遇到此問題,請聯係Databricks Support。根據Databricks工作空間的配置,可以增加允許到內部metastore的連接數。

問題4:表操作失敗,因為列有太多元數據

當單列的元數據數量超過4000個字符時,表操作失敗,錯誤如下:

SQL語句中的錯誤:IllegalArgumentException: Error: type expected at the position 3998 of 'struct
         

導致

這是在Hive Metastore 2.3.0版本中修複的錯誤(蜂巢- 12274).Databricks使用早期版本的Hive Metastore(0.13版本),因此當一個列的元數據太多時,例如導入的JSON模式,就會出現此錯誤。

解決方案

作為解決方案,設置一個外部Hive亞穩態(AWS|Azure),使用2.3.0或以上版本。然後使用如下命令刪除現有表:

% scala火花。sessionState .catalog .externalCatalog .dropTable("default", "test_table_tabledrop_1", ignoreIfNotExists = false, purge = false)