当前位置: 首页 > news >正文

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 add
 any 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命令的方式添加或者删除分区的情况,添加分区的会将元数据写入到元数据库中,删除分区的会将对应的元数据信息删除。

相关文章:

  • [I2C]I2C通信协议详解(一) --- 什么是I2C
  • 寄——在外拼搏的你一路平安,早日团圆
  • C++11之右值引用:移动语义和完美转发(带你了解移动构造函数、纯右值、将亡值、右值引用、std::move、forward等新概念)
  • 【手把手带你学JavaSE】第八篇:抽象类和接口
  • 18年程序员生涯,读了200多本编程书,挑出一些精华分享给大家
  • 广播解决方案:Livemind Recorder:录音机
  • 罗克韦尔AB PLC(RSLogix 5000)在线修改程序的具体方法示例
  • 2020 关于Map Map,String> Map,Object>的简单使用
  • 2019蓝桥杯省赛---java---C---5(最大降雨量)
  • 一键下载小说(二):如何在Django中部署
  • Java线程基础-CountDownLatch-批量执行多线程完成,再由主线程发起
  • 语音信号处理:torchaudio库【STFT、Spectrogram、MelSpectrogram、MFCC、LFCC】
  • 顶级接口Collection
  • ERP采购管理 金蝶
  • 【Linux】系统安装
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • CSS盒模型深入
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Node 版本管理
  • Puppeteer:浏览器控制器
  • Python 反序列化安全问题(二)
  • RxJS: 简单入门
  • spring + angular 实现导出excel
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • webgl (原生)基础入门指南【一】
  • windows下使用nginx调试简介
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端性能优化--懒加载和预加载
  • 全栈开发——Linux
  • 微服务入门【系列视频课程】
  • 我这样减少了26.5M Java内存!
  •  一套莫尔斯电报听写、翻译系统
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 你对linux中grep命令知道多少?
  • $.ajax中的eval及dataType
  • (13):Silverlight 2 数据与通信之WebRequest
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (简单) HDU 2612 Find a way,BFS。
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十)c52学习之旅-定时器实验
  • (转)EOS中账户、钱包和密钥的关系
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net专家(高海东的专栏)
  • @selector(..)警告提示
  • @在php中起什么作用?
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [2669]2-2 Time类的定义
  • [Android]一个简单使用Handler做Timer的例子
  • [Angular] 笔记 21:@ViewChild
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [echarts] y轴不显示0