如何解決幾個Apache蜂巢metastore問題

Apache蜂巢metastore學習如何解決問題。

寫的亞當Pavlacka

去年發表在:2022年5月16日

問題1:外部metastore表不可用

當你檢查司機的日誌,你看到一個堆棧跟蹤,包括錯誤缺少必需的表:

警告查詢:查詢org.apache.hadoop.hive.metastore.model的候選人。MDatabase和子類導致不需要可能的候選人表缺失:“星展”目錄”“模式”。DataNucleus需要這個表來執行其持久化操作。元數據是不正確的,或者你需要啟用“datanucleus.schema。org.datanucleus.store.rdbms.exceptions autoCreateTables”。MissingTableException:缺少需要的表:“星展”目錄”“模式”。DataNucleus需要這個表來執行其持久化操作。元數據是不正確的,或者你需要啟用“datanucleus.schema。autoCreateTables”org.datanucleus.store.rdbms.table.AbstractTable.exists (AbstractTable.java: 606) org.datanucleus.store.rdbms.RDBMSStoreManager ClassAdder.performTablesValidation美元(RDBMSStoreManager。java: 33 85)

導致

數據庫中存在,但沒有metastore表。

解決方案

如果外部metastore蜂巢2.0或以上版本,使用蜂巢模式工具創建metastore表。對於版本低於蜂巢2.0,添加metastore表在你現有的init腳本使用以下配置:

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

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

datanucleus。datanucleus autoCreateSchema如此。fixedDatastore假

問題2:蜂巢metastore驗證失敗

當你檢查司機的日誌,你看到一個堆棧跟蹤,包括一個錯誤如下:

18/09/24 14:51:07錯誤RetryingHMSHandler: HMSHandler致命錯誤:MetaException(信息:版本信息中沒有metastore)。在org.apache.hadoop.hive.metastore.ObjectStore。checkSchema (ObjectStore . java: 7564) org.apache.hadoop.hive.metastore.ObjectStore.verifySchema (ObjectStore。在sun.reflect.NativeMethodAccessorImpl java: 7542)。invoke0(本地方法)

導致

版本metastore表是空的。

解決方案

做下列之一:

  • 填充版本表與正確的版本使用一個值插入查詢。
  • 設置以下配置關閉metastore驗證火花集群的配置:
    hive.metastore.schema。驗證錯誤hive.metastore.schema.verification.record。版本錯誤

問題3:Metastore連接限製超過

命令運行在集群上使用以下堆棧跟蹤失敗的司機日誌:

無法打開測試連接到給定的數據庫。JDBC url = JDBC: < jdbcURL > ?trustServerCertificate = true&useSS L = true,用戶名= <編輯>。終止連接池(如果你希望開始lazyInit設置為true數據庫應用程序之後)。原始異常:- - - - - - java.sql。SQLSyntaxErrorException:用戶“<用戶名>”已經超過了“max_user_connections”資源(當前值:100)org.mariadb.jdbc.internal.util.exceptions.Except ionMapper.get (ExceptionMapper.java: 163) org.mariadb.jdbc.internal.util.exceptions.Except ionMapper.getException (ExceptionMapper.java: 106) org.mariadb.jdbc.internal.protocol.AbstractConne ctProtocol。connectWithoutProxy (AbstractConnectPr otocol.java: 1036)

導致

metastore配置隻允許100個連接。當連接限製,不允許新連接,命令失敗與錯誤。每個集群的磚工作區與metastore建立一個連接。如果你有大量的集群運行,那麼這個問題可能發生。此外,不正確的配置會導致連接泄漏,導致連接數不斷增加,直到達到極限。

解決方案

正確的問題以下操作之一:

  • 如果您正在使用一個外部metastore,你有大量的集群運行,然後增加外部metastore連接限製。
  • 如果你不使用外部metastore,確保你沒有任何自定義蜂巢metastore配置集群。使用提供的metastore數據磚時,您應該使用默認配置為蜂巢metastore在集群上。
  • 如果您使用的是默認配置,仍然遇到這個問題,接觸磚的支持。根據磚的工作空間的配置,有可能增加的連接允許內部metastore。

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

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

錯誤的SQL語句:IllegalArgumentException:錯誤:類型預期在3998位置的struct < num_ad_accounts: bigint num_benchmarks:長整型數字,num_days_range:字符串,num_days_in_history:字符串,num_fb_pages:長整型數字,num_g_profiles:長整型數字,num_ga_views:長整型數字,num_groups:長整型數字,num_ig_profiles:長整型數字,num_li_pages:長整型數字,num_labels:字符串,num_labels_added:長整型數字,num_labels_

導致

這是一個錯誤,是固定在蜂巢tripwire Metastore版本(蜂巢- 12274)。磚使用早期版本的蜂巢Metastore(版本0.13),所以這個錯誤發生在列元數據太多,比如進口的JSON模式。

解決方案

作為一個解決方案,建立一個外部蜂巢metastore (AWS|Azure),使用版本tripwire或以上。然後用以下命令刪除現有表:

% scala火花。sessionState .catalog .externalCatalog .dropTable(“默認”、“test_table_tabledrop_1”, ignoreIfNotExists = false,清洗= false)