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

一、背景

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

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

二、方案

有两种做法:

1、写脚本

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

【hive】hive创建库,表相关,拉数据到本地,自定义UDF,设置队列:【hive】hive创建库,表相关,拉数据到本地,自定义UDF,设置队列_lsr40的博客-优快云博客_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 <databaseOpts>             Backend DB specific options
 -dbType <databaseType>             Metastore database type
 -dryRun                            list SQL scripts (no execute)
 -help                              print this message
 -info                              Show config and schema details
 -initSchema                        Schema initialization
 -initSchemaTo <initTo>             Schema initialization to a version
 -passWord <password>               Override config file password
 -upgradeSchema                     Schema upgrade
 -upgradeSchemaFrom <upgradeFrom>   Schema upgrade from a version
 -userName <user>                   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 <query-string>             execute the given JDOQL query
 -help                                    print this message
 -listFSRoot                              print the current FS root
                                          locations
 -prepareAcidUpgrade <find-compactions>   Generates a set Compaction
                                          commands to run to prepare for
                                          Hive 2.x to 3.0 upgrade
 -serdePropKey <serde-prop-key>           Specify the key for serde
                                          property to be updated.
                                          serdePropKey option is valid
                                          only with updateLocation option.
 -tablePropKey <table-prop-key>           Specify the key for table
                                          property to be updated.
                                          tablePropKey option is valid
                                          only with updateLocation option.
 -updateLocation <new-loc> <old-loc>      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个报错

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

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注释掉就好了

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的博客-优快云博客

总结

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

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

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

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

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

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

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

<think>好的,我现在需要帮用户解决关于Hive安装配置和头歌实验目标的问题。首先,用户提到了参考的引用内容,特别是引用[1]中的实验步骤。我需要先回顾这些引用内容,确保回答准确。 用户的问题分为两部分:Hive的安装配置和头歌实验的目标。我需要先处理Hive的部分。根据引用[1],Hive的安装是在实验1的3.9部分。里面提到了安装和测试步骤,可能包括依赖项的安装,比如MySQL、JDK、Hadoop等。需要详细说明这些前提条件,然后分步骤讲解Hive的安装过程,包括配置hive-site.xml、初始化元数据等。 然后是关于配置的部分,引用[2]提到需要将Hive的配置文件复制到Spark的conf目录,这可能涉及Hive和Spark的集成配置,但用户的问题可能更关注Hive本身的配置,比如元数据存储、执行引擎设置等。这里需要结合引用[1]中的步骤,补充必要的配置细节,比如MySQL作为元数据存储的配置,以及日志路径的调整。 接下来是头歌实验的目标。引用[1]中的实验目的是搭建Hadoop大数据平台,但用户具体想知道头歌实验的目标。可能需要解释实验的整体目标,比如掌握Hive的安装、配置、与Hadoop集成,以及通过实践理解其在大数据中的应用。同时,实验可能还包括性能优化和异常处理,如引用[3]提到的数据膨胀和reduce任务优化,这些可以作为实验的扩展目标。 另外,用户可能需要了解实验的具体步骤,比如安装Hive前的准备工作,如关闭Selinux、配置网络、创建用户等,这些在引用[1]的3.2和3.3部分有提到。需要将这些步骤整理成清晰的流程,确保用户能按步骤操作。 还要注意用户可能遇到的常见问题,比如依赖项未正确安装、配置文件错误、权限问题等,引用[1]中的记录可能包含这些内容,需要适当提及或建议参考相关部分。 最后,生成的相关问题需要围绕Hive的安装配置、优化、与其他组件的集成以及实验目标展开,帮助用户进一步探索。例如,如何配置Hive元数据存储,或者如何优化Hive查询性能,这些都可以作为相关问题提出。 总结一下,回答结构应该分为Hive安装教程、配置指南、头歌实验目标三个部分,每个部分详细列出步骤和注意事项,引用相关文献,并在最后生成相关问题供用户参考。需要确保语言清晰,步骤明确,符合用户的需求。</think>### Hive安装教程与配置指南 #### 一、Hive安装教程(基于引用[1]实验1的3.9节) 1. **前提条件** - 已安装Hadoop(HDFS+YARN)[^1] - 已安装MySQL(用于存储Hive元数据)[^1] - 已配置JDK环境变量 2. **安装步骤** ```bash # 下载并解压Hive安装包 tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/module/ # 配置环境变量 export HIVE_HOME=/opt/module/hive export PATH=$PATH:$HIVE_HOME/bin # 修改配置文件hive-site.xml(参考引用[1]) <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://[MySQL地址]/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> </configuration> # 初始化元数据库 schematool -dbType mysql -initSchema ``` 3. **测试安装** ```bash hive > show databases; # 验证元数据读取 ``` --- #### 二、Hive配置指南 1. **核心配置项** - **元数据存储**:推荐使用MySQL替代默认Derby数据库 - **执行引擎**:可切换为Tez或Spark(需额外配置) - **日志路径**:修改`hive-log4j2.properties`指定日志目录 2. **与Spark集成** - 将Hive的`hive-site.xml`复制到Spark的`conf`目录[^2] - 在Spark中通过`HiveContext`访问Hive表[^4] --- #### 三、头歌实验目标解析 1. **核心目标** - 掌握Hive作为Hadoop生态数据仓库工具的部署方法[^1] - 理解Hive元数据管理与SQL-on-Hadoop的实现原理 - 实现Hive与Spark的协同计算(如通过RDD操作Hive数据) 2. **扩展目标** - 学习Hive SQL优化技巧(如避免数据膨胀导致的Reduce任务不足)[^3] - 实践Hive在ETL、日志分析等场景的应用 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值