赞
踩
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
);
这里一定注意 utf8_bin 【区分大小写】 如果使用了 utf8_general_ci 这种字符集是不区分大小写的 ,会与上面设置的唯一索引冲突
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。