A metaadattár több Apache Hive hibaelhárítása

1. probléma: A külső metaadattár-táblák nem érhetők el

Az illesztőprogram naplóinak vizsgálatakor egy hívássor-nyomkövetés jelenik meg, amely a hibát Required table missing tartalmazza:

WARN Query: Query for candidates of org.apache.hadoop.hive.metastore.model.MDatabase and subclasses resulted in no possible candidates

Required table missing: "DBS" in Catalog "" Schema "". DataNucleus requires this table to perform its
persistence operations. Either your MetaData is incorrect, or you need to enable
"datanucleus.schema.autoCreateTables"

org.datanucleus.store.rdbms.exceptions.MissingTableException: Required table missing : "DBS" in Catalog ""  Schema "". DataNucleus requires this table to perform its persistence operations. Either your MetaData is incorrect, or you need to enable
"datanucleus.schema.autoCreateTables"

   at

org.datanucleus.store.rdbms.table.AbstractTable.exists(AbstractTable.java:606)

   at

org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:33
85)

Ok

Az adatbázis jelen van, de nincsenek metaadattár-táblák.

Megoldás

Ha a külső metaadattár verziója Hive 2.0 vagy újabb, a Hive Schema Tool eszközzel hozza létre a metaadattár-táblákat. A Hive 2.0 alatti verziók esetén adja hozzá a metaadattár-táblákat a meglévő init szkriptben a következő konfigurációval:

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

Ezeket a konfigurációkat közvetlenül az Apache Spark-konfigurációban is beállíthatja:

datanucleus.autoCreateSchema true
datanucleus.fixedDatastore false

2. probléma: A Hive-metaadattár ellenőrzése sikertelen volt

Az illesztőprogram naplóinak vizsgálatakor egy hívássor-nyomkövetés jelenik meg, amely az alábbihoz hasonló hibát tartalmaz:

18/09/24 14:51:07 ERROR RetryingHMSHandler: HMSHandler Fatal error:
MetaException(message:Version information not found in metastore. )

   at
org.apache.hadoop.hive.metastore.ObjectStore.checkSchema(ObjectStore
.java:7564)

   at
org.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore.
java:7542)

   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Ok

A VERSION metaadattár táblája üres.

Megoldás

Tegye a következők egyikét:

  • Töltse fel VERSION a táblát a megfelelő verzióértékekkel egy INSERT lekérdezéssel.

  • Állítsa be a következő konfigurációkat, hogy kikapcsolja a metaadattár-ellenőrzést a fürt Spark-konfigurációjában:

    hive.metastore.schema.verification false
    hive.metastore.schema.verification.record.version false
    

3. probléma: A metaadattár kapcsolati korlátja túllépve

A fürtön futtatott parancsok az alábbi hívási hívással meghiúsulnak az illesztőprogram-naplókban:

Unable to open a test connection to the given
database. JDBC url =
jdbc:<jdbcURL>?trustServerCertificate=true&useSS
L=true, username = <REDACTED>. Terminating
connection pool (set lazyInit to true if you
expect to start your database after your app).
Original Exception: ------

java.sql.SQLSyntaxErrorException: User
'<userId>' 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.AbstractConne
ctProtocol.connectWithoutProxy(AbstractConnectPr
otocol.java:1036)

Ok

A metaadattár konfigurációja csak 100 kapcsolatot tesz lehetővé. A csatlakozási korlát elérésekor az új kapcsolatok nem engedélyezettek, és a parancsok ezzel a hibával meghiúsulnak. A Azure Databricks minden fürt kapcsolatot létesít a metaadattártal. Ha nagy számú fürt fut, akkor ez a probléma léphet fel. Emellett a helytelen konfigurációk kapcsolatvesztést okozhatnak, ami miatt a kapcsolatok száma a korlát eléréseig folyamatosan nő.

Megoldás

Javítsa ki a problémát az alábbi műveletek egyikével:

  • Ha külső metaadattárat használ, és nagy számú fürt fut, növelje a kapcsolati korlátot a külső metaadattáron.
  • Ha nem használ külső metaadattárat, győződjön meg arról, hogy nem használ egyéni Hive-metaadattár-konfigurációkat a fürtön. A Azure Databricks által biztosított metaadattár használata esetén a Hive-metaadattár alapértelmezett konfigurációit kell használnia a fürtön.
  • Ha az alapértelmezett konfigurációt használja, és továbbra is ezzel a hibával találkozik, lépjen kapcsolatba a Azure Databricks ügyfélszolgálatával. A munkaterület konfigurációjának Azure Databricks meg lehet növelni a belső metaadattárhoz engedélyezett kapcsolatok számát.

4. probléma: A táblaműveletek meghiúsulnak, mert az oszlop túl sok metaadatot tartalmaz

Ha egy oszlop metaadatainak mennyisége meghaladja a 4000 karaktert, a táblaműveletek a következő hibával meghiúsulnak:

Error in SQL statement: IllegalArgumentException:
Error: type expected at the position 3998 of 'struct<num_ad_accounts:bigint,num_benchmarks:bigint,num_days_range:string,num_days_in_history:string,num_fb_pages:bigint,num_g_profiles:bigint,num_ga_views:bigint,num_groups:bigint,num_ig_profiles:bigint,num_li_pages:bigint,num_labels:string,num_labels_added:bigint,num_labels_

Ok

Ez a hiba a Hive-metaadattár 2.3.0-s verziójában javítva lett (HIVE-12274). Azure Databricks a Hive-metaadattár (0.13-as verzió) egy korábbi verzióját használja, ezért ez a hiba akkor fordul elő, ha túl sok metaadat található egy oszlophoz, például egy importált JSON-sémához.

Megoldás

Áthidaló megoldásként állítson be egy külső Hive-metaadattárat, amely a 2.3.0-s vagy újabb verziót használja. Ezután törölje a meglévő táblát a következő paranccsal:

spark.sessionState
  .catalog
  .externalCatalog
  .dropTable("default", "test_table_tabledrop_1", ignoreIfNotExists = false, purge = false)