关于使用msck修复hive分区,以及在添加分区缓慢的问题

1)需要修复的分区数量很大的解决办法
set hive.msck.repair.batch.size=1000;
set hive.msck.path.validation=ignore;
第一个参数是设置每次插入到metaStore 分区的批量大小,加入有10000个待修复的分区 那么这里就是10000/1000 共计十个批次,默认如果不设置此参数会把所有数据全部发送到metastore 中执行插入操作。
第二个参数是忽略掉非标准分区表的,不会对这种分区做任何操作,如果需要加入的话 也是需要自己手动alter table xx add partition(xxx) location ‘’;

2)添加缓慢问题
最近项目中在修复分区时发现 alter msck 两种方式都很慢,单单执行一个alter 也很慢,后来发现是由于hive 在mysql 中的元数据表缺失了索引导致的(这里是因为在使用msck 修复部分分区停掉程序后 在hive 终端执行alter 添加分区 报错 expect one partition but more found 然后到mysql PARTITIONS 表中看分区名有重复的,然后我们对比了这边两个集群的元数据信息发现缺失了 PART_ID与TBL_ID 的唯一复合索引,这里猜想应该是插入之前需要根据 分区名称 + 表id 做是否存在的校验,之前这两个字段上是没有唯一索引的,并且这里还发现一个问题是 会存在一个表相同的分区名称有多条记录)。
解决办法:
2.1)删除相关重复记录,主要涉及如下三张表,需要将重复的分区手动删除
PARTITIONS
PARTITION_KEY_VALS
PARTITION_PARAMS
2.2) 添加索引
alter table PARTITIONS add UNIQUE KEY UNIQUEPARTITION (PART_NAME,TBL_ID); --主要是这个
alter table PARTITION_KEY_VALS add KEY PARTITION_KEY_VALS_N49 (PART_ID);

  1. 解决中文问题
    这里在修复过程中发现部分分区名称中含有中文,导致在有中文参与查询时会报错
    Illegal mix of collations (latin1_bin,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ‘=’
    报错意思是 服务端是latin1 客户端过来的是utf8 编码不一致 不能比较
    所以这里需要修改相关字段的字符集 这里主要是PART_NAME字段
    ALTER TABLE PARTITIONS CHANGE PART_NAME PART_NAME varchar(767) CHARACTER SET utf8 COLLATE utf8_bin;

这里一定注意 utf8_bin 【区分大小写】 如果使用了 utf8_general_ci 这种字符集是不区分大小写的 ,会与上面设置的唯一索引冲突

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值