msck 修复一个大表需要很长时间

Posted

技术标签:

【中文标题】msck 修复一个大表需要很长时间【英文标题】:msck repair a big table take very long time 【发布时间】:2020-04-29 10:06:35 【问题描述】:

我每天都会将数据摄取到 HDFS 中。从数据到 HDFS,我生成按日期和另一列分区的 Hive 表。一天有130G数据。生成数据后,我运行msck repair。现在每个 msck 任务超过 2 小时。在我看来,msck 会扫描整个表数据(我们有大约 200 天的数据),然后更新元数据。我的问题是:有没有办法让 msck 只扫描最后一天的数据,然后更新元数据以加快整个过程?顺便说一下没有小文件的问题,msck之前我已经合并了小文件。

【问题讨论】:

【参考方案1】:

当您使用此配置创建外部表或进行修复/恢复分区时:

set hive.stats.autogather=true;

Hive 扫描表位置中的每个文件以获取统计信息,这可能会花费太多时间。

解决方案是在创建/更改表/恢复分区之前将其关闭

set hive.stats.autogather=false; 

查看这些相关工单:HIVE-18743、HIVE-19489,HIVE-17478

如果您需要统计信息,您可以在必要时仅收集新分区的统计信息

ANALYZE TABLE [db_name.]tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)]  
  COMPUTE STATISTICS 

在此处查看详细信息:ANALYZE TABLE

如果您知道应该添加哪些分区,请使用ALTER TABLE ADD PARTITION - 您可以在单个命令中添加多个分区。

【讨论】:

以上是关于msck 修复一个大表需要很长时间的主要内容,如果未能解决你的问题,请参考以下文章

如果未添加新分区,则需要 hive 每日 msck 修复

简单连接的问题需要很长时间才能完成

带有 NOT IN 子查询的 SELECT INTO 查询需要很长时间/挂起

如何阻止用户等待很长时间才能获得位置修复?

将视图插入表格 - 视图不需要很长时间才能运行 - 插入需要很长时间

简单的选择需要很长时间才能执行