hive的版本更新得蛮快的,但是一般我们定好一个版本之后,就不太会升级,不过有时候集群迁移,顺手想要用到一些新版本的特性,就会遇到升级hive的版本的场景
这就涉及到元数据升级和迁移:
有两种做法:
通过脚本获得所有的建表语句,然后直接在高版本的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
升级
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版本是0.14.0
那么就可以执行:schematool -dbType mysql -upgradeSchemaFrom 0.14.0 -dryRun 来查看实际会运行哪些脚本
那我们就可以到这些upgrade脚本中看看具体执行了哪些sql,例如:
所以其实原理就是,升级版本的脚本里面有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个报错
021-HIVE-7018.mysql.sql里面报的错
这里是个存储过程,判断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,发现外键不存在(下图是存在的情况,不同版本有的在有的不在,不在就会报错)
所以把上面那两条alter注释掉就好了
这个报错,就是创建索引的时候,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跨版本升级全姿势与避坑指南
好奇心和适当的固执,是很能推动个人成长的因素,遇到问题,要多思考内在的原理,单纯浮于表面很难有所提高!
还有背单词这个事情,目标定的太大(每天背太多),反而每天都想懈怠,小小的目标,一步一步走,也能达到终点~