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

相关文章

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

SpringBoot整合Canal+RabbitMQ监听数据变更详解

《SpringBoot整合Canal+RabbitMQ监听数据变更详解》在现代分布式系统中,实时获取数据库的变更信息是一个常见的需求,本文将介绍SpringBoot如何通过整合Canal和Rabbit... 目录需求步骤环境搭建整合SpringBoot与Canal实现客户端Canal整合RabbitMQSp

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.