2.Hive表结构变更时,滥用MSCK REPAIR TABLE语句,导致变更语句执行时间过长

本文主要是介绍2.Hive表结构变更时,滥用MSCK REPAIR TABLE语句,导致变更语句执行时间过长,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.分析原因

        很多人可能都知道这个语句是用来修复分区的,但具体修复了什么,就说不上来了。

2.解决办法

        搞清楚这个命令的作用就不会滥用了。

3.实战演习

        (1)查看官方文档

          (a)从这一段说明可以看出,元数据中存储着一个关于分区的列表,如果通过hadoop 命令或者其他方式(非hive命令)在hdfs上添加了分区,元数据库并不能自动感知到分区的修改。

Recover Partitions (MSCK REPAIR TABLE)Hive stores a list of partitions for each table in its metastore. If, 
however, new partitions are directly added to HDFS (say by using hadoop 
fs -put command) or removed from HDFS, the metastore (and hence Hive) 
will not be aware of these changes to partition information unless the 
user runs ALTER TABLE table_name ADD/DROP PARTITION commands on each 
of the newly added or removed partitions, respectively.恢复分区(MSCK REPAIR TABLE)  Hive在它的元存储中为每个表存储一个分区列表。 如果, 然而,新的分区直接添
加到HDFS(比如使用hadoop fs -put命令)或从HDFS中删除,这些分区信息不会被元存
储感知到,除非用户在每个新添加或删除的分区上分别运行ALTER TABLE table_name
ADD/DROP PARTITION命令。 

        (b)从这一段可以看出,这个命令的默认选项是ADD,可以自动更新添加的分区信息到元数据库中,选择DROP选项,可以自动更新删除的分区信息到元数据库中,选择SYNC选项,相当于调用了ADD和DROP这两个选项。

    However, users can run a metastore check command with the repair table 
option:MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];which will update metadata about partitions to the Hive metastore for 
partitions for which such metadata doesn't already exist. The default 
option for MSC command is ADD PARTITIONS. With this option, it will addany partitions that exist on HDFS but not in metastore to the metastore. 
The DROP PARTITIONS option will remove the partition information from 
metastore, that is already removed from HDFS. The SYNC PARTITIONS option 
is equivalent to calling both ADD and DROP PARTITIONS. See HIVE-874 and 
HIVE-17824 for more details. When there is a large number of untracked 
partitions, there is a provision to run MSCK REPAIR TABLE batch wise to 
avoid OOME (Out of Memory Error). By giving the configured batch size for 
the property hive.msck.repair.batch.size it can run in the batches 
internally. The default value of the property is zero, it means it will 
execute all the partitions at once. MSCK command without the REPAIR option 
can be used to find details about metadata mismatch metastore.但是,用户可以使用repair table选项运行metastore检查命令:MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];对于这些元数据还不存在的分区,它将更新关于分区的元数据到Hive元存储。
MSC命令的默认选项是ADD PARTITIONS。有了这个选项,它将把HDFS上存在但不在
元存储中的任何分区添加到元存储中。DROP PARTITIONS选项将从metastore中删除
已经从HDFS中删除的分区信息。SYNC PARTITIONS选项相当于同时调用这两个选项。
查看HIVE-874和HIVE-17824获取更多细节。当存在大量未跟踪的分区时,可以通过
批量运行MSCK REPAIR TABLE来避免OOME(内存不足错误)。通过为属性hive.msck
.repair.batch.size提供配置的批处理大小,它可以在内部运行批处理。该属性的
默认值为零,这意味着它将一次性执行所有分区。不带REPAIR选项的MSCK命令可以
用于查找元数据不匹配的元存储的详细信息。

        (2)演示效果

        (a)使用默认选项(ADD),另外另个选项类似,可以自行实验

               step1:建一张表,并通过hive命令添加一个分区,并查看分区情况

CREATE TABLE IF NOT EXISTS test.test
(id         INT,name       STRING,gender     STRING
)
PARTITIONED BY (pt_d STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
;ALTER TABLE test.test ADD PARTITION(pt_d = '20211102');SHOW PARTITIONS test.test;

        step2:通过hadoop命令和其他方式创建分区 ,可以

hadoop fs -mkdir hdfs://hadoop01:9000/user/hive/warehouse/test.db/test/pt_d=20211101

 

         step3:查看分区的元数据信息

SHOW PARTITIONS test.test;

        step4:使用msck repair命令后查看分区的元数据信息 ,可以看到,使用命令后,元数据信息已经更新。

MSCK REPAIR TABLE test.test;SHOW PARTITIONS test.test;

 4.总结

        MSCK命令只有一个作用,就是来检测通过非hive命令的方式添加或者删除分区的情况,添加分区的会将元数据写入到元数据库中,删除分区的会将对应的元数据信息删除。

这篇关于2.Hive表结构变更时,滥用MSCK REPAIR TABLE语句,导致变更语句执行时间过长的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671161

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数