查看那个警告日志,里面提示“该表状态没有主键”,经过讨论最后找出了问题所在,DBA的数据库因为权限问题所以限制的比较严格,所有表的创建必须有主键,但是很可能hive自动创建的那57张表中可能有没有主键的表,导致mysql创建的表并不全,最后问题出现。
表名:
COMPLETED_TXN_COMPONENTS
NEXT_COMPACTION_QUEUE_ID
NEXT_LOCK_ID
NEXT_TXN_ID
TXN_COMPONENTS
WRITE_SET
我们在测试环境上连上mysql,使用下面语句:
select distinct table_name from columns where TABLE_SCHEMA = 'hive' and table_name not in (查出来有六张表是没有限制主键的,看了它的表结构后,我们大胆的在测试环境上手动给这六张表添加了主键,当时选择添加主键的字段都是形式ID这类的,添加完之后在测试环境上进行了多次测试,发现主键添加后并不影响hive运行。
select distinct table_name from COLUMNS
where TABLE_SCHEMA = 'hive' and (column_key = 'PRI' or column_key = 'UNI')
)
针对测试环境得出来的结论和与DBA讨论的结果,我们商量出下面一个解决办法,首先在集群本地安装一个没有限制的临时mysql用来安装hive,在几个hive客户端和服务端建立域名映射,修改如下:
10.20.148.20 dbhost
然后直接用hive指向这个mysql进行安装,因为权限是全部放开的,所以hive安装后正常,为了之后迁移方便,这个临时数据库的用户名和表名,端口等等都是与DBA数据库那一端一样的。
alter table COMPLETED_TXN_COMPONENTS add primary key COMPLETED_TXN_COMPONENTS(CTC_TXNID);安装完成之后我们手动为没有主键的表添加上了主键,测试也是正常。最终让DBA将这个临时数据库的hive元数据全部迁移到DBA中,重启集群之后,运行正常,问题解决。
alter table NEXT_COMPACTION_QUEUE_ID add primary key NEXT_COMPACTION_QUEUE_ID(NCQ_NEXT);
alter table NEXT_LOCK_ID add primary key NEXT_LOCK_ID(NL_NEXT);
alter table NEXT_TXN_ID add primary key NEXT_TXN_ID(NTXN_NEXT);
alter table TXN_COMPONENTS add primary key TXN_COMPONENTS(TC_TXNID);
alter table WRITE_SET add primary key WRITE_SET(WS_TXNID);