다양한 Apache Hive 메타스토어 문제 해결 방법

문제 1: 외부 metastore 테이블을 사용할 수 없음

드라이버 로그를 검사 하면 오류를 포함 하는 스택 추적이 표시 됩니다 Required table missing .

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)

원인

데이터베이스가 있지만 metastore 테이블이 없습니다.

해결 방법

외부 metastore 버전이 Hive 2.0 이상인 경우 Hive 스키마 도구 를 사용 하 여 metastore 테이블을 만듭니다. Hive 2.0 아래 버전의 경우 기존 init 스크립트에서 다음 구성을 사용 하 여 metastore 테이블을 추가 합니다.

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

Apache Spark 구성 에서 직접 이러한 구성을 설정할 수도 있습니다.

datanucleus.autoCreateSchema true
datanucleus.fixedDatastore false

문제 2: Hive metastore 확인 실패

드라이버 로그를 검사할 때 다음과 같은 오류가 포함 된 스택 추적이 표시 됩니다.

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)

원인

VERSIONMetastore의 테이블이 비어 있습니다.

해결 방법

다음 중 하나를 수행합니다.

  • 쿼리를 VERSION 사용 하 여 올바른 버전 값으로 테이블을 채웁니다 INSERT .

  • 클러스터의 Spark 구성에서 metastore 확인을 해제 하려면 다음 구성을 설정 합니다.

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

문제 3: Metastore 연결 제한을 초과 했습니다.

클러스터에서 실행 되는 명령은 드라이버 로그에서 다음 스택 추적을 사용 하 여 실패 합니다.

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)

원인

Metastore 구성은 100 연결만 허용 합니다. 연결 제한에 도달 하면 새 연결이 허용 되지 않으며 명령이 실패 하 고이 오류가 발생 합니다. Azure Databricks 작업 영역의 각 클러스터는 metastore 연결을 설정 합니다. 많은 수의 클러스터를 실행 하는 경우이 문제가 발생할 수 있습니다. 또한 잘못 된 구성으로 인해 연결 누수가 발생 하 여 제한에 도달할 때까지 연결 수가 증가할 수 있습니다.

해결 방법

다음 작업 중 하나를 사용 하 여 문제를 해결 합니다.

  • 외부 metastore를 사용 하는 경우 많은 수의 클러스터를 실행 하는 경우 외부 metastore 연결 제한을 늘립니다.
  • 외부 metastore를 사용 하지 않는 경우 클러스터에 사용자 지정 Hive metastore 구성이 없는지 확인 합니다. Azure Databricks에서 제공 하는 metastore을 사용 하는 경우 Hive metastore 클러스터에서 기본 구성을 사용 해야 합니다.
  • 기본 구성을 사용 하 고 있는 경우에도이 문제가 발생 하면 Azure Databricks 지원 담당자에 게 문의 하세요. Azure Databricks 작업 영역의 구성에 따라 내부 metastore 허용 되는 연결 수를 늘릴 수 있습니다.

문제 4: 열에 너무 많은 메타 데이터가 있으므로 테이블 작업이 실패 함

단일 열에 대 한 메타 데이터의 수량이 4000 자를 초과 하면 테이블 작업이 실패 하 고 다음과 같은 오류가 발생 합니다.

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_

원인

Hive Metastore version 2.3.0 (hive-12274)에서 수정 된 버그입니다. Azure Databricks는 이전 버전의 Hive Metastore (버전 0.13)를 사용 하므로 가져온 JSON 스키마와 같이 열에 대 한 메타 데이터가 너무 많은 경우이 버그가 발생 합니다.

해결 방법

이 문제를 해결 하려면 버전 2.3.0 이상을 사용 하는 외부 Hive metastore 를 설정 합니다. 다음 명령을 사용 하 여 기존 테이블을 삭제 합니다.

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