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

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3

一个Java的main方法在JVM中的执行流程示例详解

《一个Java的main方法在JVM中的执行流程示例详解》main方法是Java程序的入口点,程序从这里开始执行,:本文主要介绍一个Java的main方法在JVM中执行流程的相关资料,文中通过代码... 目录第一阶段:加载 (Loading)第二阶段:链接 (Linking)第三阶段:初始化 (Initia

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频