【Hive】升级元数据踩坑(mysql版本)

一、背景

hive的版本更新得蛮快的,但是一般我们定好一个版本之后,就不太会升级,不过有时候集群迁移,顺手想要用到一些新版本的特性,就会遇到升级hive的版本的场景

这就涉及到元数据升级和迁移:

二、方案

有两种做法:

1、写脚本

通过脚本获得所有的建表语句,然后直接在高版本的hive中执行相应的建表语句,然后数据导入之后,msck repair table(修复下分区信息)

【hive】hive创建库,表相关,拉数据到本地,自定义UDF,设置队列:【hive】hive创建库,表相关,拉数据到本地,自定义UDF,设置队列_lsr40的博客-CSDN博客_hive udf为本地

但是如果批量修复元数据,有可能分区太多导致OOM,可以设置下批次,比如:set hive.msck.repair.batch.size=5000;

我只能给出一个大概的例子,参照这个例子再去添加相应的符合各人需求的内容就可以~

#!/bin/bash 
#查询获得所有databases
databases=`hive -S -e "show databases;"`
echo $databases
array=(${databases// / })  
#循环传入database
for database in ${array[@]}
do
   #获取该库下所有tables
   tablenames=`hive -S -e "use $database; show tables;"`
   table_array=(${tablenames// / })
   #删除该库历史建表语句
   rm -rf ${database}.txt
   #循环传入table
   for tablename in ${table_array[@]}
   do
      create_table=`hive -S -e "use $database; show create table $tablename;"`";"
      echo -e $create_table >>${database}.txt 
      echo -e '\n' >>${database}.txt
   done
done

2、升级元数据库

升级

hive有提供相应的命令更新和修改元数据库

schematool 和 metatool (升级元数据库,使用schematool就好了)

比如初始化元数据库:schematool -dbType mysql -initSchema

schematool -help
usage: schemaTool
 -dbOpts              Backend DB specific options
 -dbType              Metastore database type
 -dryRun                            list SQL scripts (no execute)
 -help                              print this message
 -info                              Show config and schema details
 -initSchema                        Schema initialization
 -initSchemaTo              Schema initialization to a version
 -passWord                Override config file password
 -upgradeSchema                     Schema upgrade
 -upgradeSchemaFrom    Schema upgrade from a version
 -userName                    Override config file user name
 -verbose                           only print SQL statements
metatool -help
usage: metatool
 -dryRun                                  Perform a dry run of
                                          updateLocation changes.When run
                                          with the dryRun option
                                          updateLocation changes are
                                          displayed but not persisted.
                                          dryRun is valid only with the
                                          updateLocation option.
 -executeJDOQL              execute the given JDOQL query
 -help                                    print this message
 -listFSRoot                              print the current FS root
                                          locations
 -prepareAcidUpgrade    Generates a set Compaction
                                          commands to run to prepare for
                                          Hive 2.x to 3.0 upgrade
 -serdePropKey            Specify the key for serde
                                          property to be updated.
                                          serdePropKey option is valid
                                          only with updateLocation option.
 -tablePropKey            Specify the key for table
                                          property to be updated.
                                          tablePropKey option is valid
                                          only with updateLocation option.
 -updateLocation        Update FS root location in the
                                          metastore to new location.Both
                                          new-loc and old-loc should be
                                          valid URIs with valid host names
                                          and schemes.When run with the
                                          dryRun option changes are
                                          displayed but are not persisted.
                                          When run with the
                                          serdepropKey/tablePropKey option
                                          updateLocation looks for the
                                          serde-prop-key/table-prop-key
                                          that is specified and updates
                                          its value if found.

在$HIVE_HOME/scripts/metastore/upgrade/mysql目录下,有相应的升级脚本

【Hive】升级元数据踩坑(mysql版本)_第1张图片

假设我的hive版本是0.14.0

那么就可以执行:schematool -dbType mysql -upgradeSchemaFrom 0.14.0 -dryRun 来查看实际会运行哪些脚本

【Hive】升级元数据踩坑(mysql版本)_第2张图片

那我们就可以到这些upgrade脚本中看看具体执行了哪些sql,例如:

【Hive】升级元数据踩坑(mysql版本)_第3张图片

所以其实原理就是,升级版本的脚本里面有hive的一个又一个的issue,每个issue脚本里,都是一段sql,可能是新增字段,或者创建索引等操作

所以我们有两种更新方式:

(1)、schematool -dbType mysql -upgradeSchemaFrom 0.14.0

可以到元数据库中做sql查询,看到具体的版本:select * from 元数据库.VERSION;

(2)、拿每一个版本升级的sql去mysql里面做source

两种有什么区别的?

第一种,如果sql报错,整个升级任务可能停下来,但是有些命令并不是事务的,所以会导致第一遍执行因为报错C停了下来,然后你解决了报错C,重新执行的时候,会有各种的Duplicate column name xxx,因为在上一次你添加字段或者索引成功了,现在要重复添加就报错了,这时候你就要把整个库删了,重新导入一遍,重新升级,还是挺麻烦的

第二种,自己去数据库手动source,不会因为某一段报错而停止,所以要注意看升级版本的时候有没有报错,如果要报错要去解决,不然可能你升级后续的版本会遇到缺失字段等异常

三、报错

我来说说我遇到的2个报错

1、升级upgrade-1.2.0-to-2.0.0.mysql.sql

021-HIVE-7018.mysql.sql里面报的错

【Hive】升级元数据踩坑(mysql版本)_第4张图片

这里是个存储过程,判断PARTITIONS和TBLS里面有没有LINK_TARGET_ID字段,有的话,就做对应的删除

至于为什么要删除,大家可以看下这个issue:[HIVE-7018] Table and Partition tables have column LINK_TARGET_ID in Mysql scripts but not others - ASF JIRA

这个报错,是删除外键报的错,因为存储过程里在执行了下面这两条

ALTER TABLE `TBLS` DROP FOREIGN KEY `TBLS_FK3`;

ALTER TABLE `PARTITIONS` DROP FOREIGN KEY `PARTITIONS_FK3`;

我show create table TBLS和PARTITIONS,发现外键不存在(下图是存在的情况,不同版本有的在有的不在,不在就会报错

【Hive】升级元数据踩坑(mysql版本)_第5张图片

所以把上面那两条alter注释掉就好了

2、Specified key was too long; max key length is 767 bytes

这个报错,就是创建索引的时候,utf-8长度超过了,大家有兴趣翻翻相关文章就好

具体是因为:upgrade-2.3.0-to-3.0.0.mysql.sql

执行了:ALTER TABLE `DBS` ADD UNIQUE KEY `UNIQUE_DATABASE` (`NAME`, `CTLG_NAME`);

但是CTLG_NAME和NAME都是utf-8,所以超过了

可以在脚本中将原来的这条:ALTER TABLE `DBS` CHANGE COLUMN `CTLG_NAME` `CTLG_NAME` varchar(256) NOT NULL DEFAULT 'hive';
修改为:ALTER TABLE `DBS` CHANGE COLUMN `CTLG_NAME` `CTLG_NAME` varchar(256) CHARACTER SET latin1 NOT NULL DEFAULT 'hive';

Specified key was too long; max key length is 767 bytes问题解决:Specified key was too long; max key length is 767 bytes问题解决_wowo_zZ的博客-CSDN博客

总结

反正原理就是这样,到数据库中实际执行一些create或者alter语句,执行的时候有具体报错具体解决就好

菜鸡一只,努力学习提升自己~

特别感谢以下这两篇文章给我带来的帮助:

解决MySQL删除外键时报错:解决MySQL删除外键时报错_动静如水的博客-CSDN博客(作者:动静如水)

Hive 0.13到Hive 2.1跨版本升级全姿势与避坑指南 :Hive 0.13到Hive 2.1跨版本升级全姿势与避坑指南

好奇心和适当的固执,是很能推动个人成长的因素,遇到问题,要多思考内在的原理,单纯浮于表面很难有所提高!

还有背单词这个事情,目标定的太大(每天背太多),反而每天都想懈怠,小小的目标,一步一步走,也能达到终点~

你可能感兴趣的:(hive,hive,mysql,hadoop)