如何解决几个Apache蜂巢metastore问题

Apache蜂巢metastore学习如何解决问题。

写的亚当Pavlacka

去年发表在:2023年8月1日

问题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)


这篇文章有用吗?