背景:

我们这边有线上线下两套hive, 版本:0.13.0,由于版本较低,近期准备升级新的hive版本。

首先选择升级线下hive集群:

线下 hive 集群覆盖较广,牵扯大概10台左右客户端, 覆盖公司所有的技术部门业务数据。 每天通过客户端或者azkaban上传作业 1w 左右的任务量.
meta store 包含分区大概700w左右的量。业务量重,而且 sql 变化较多, 有较多的自定义 udf 与 自定义 serde 文件在其中。

如果一次性做全量升级容易出现较多问题, 影响较多部门,一旦出现意外情况回滚较为复杂。
而且一次性全量升级需要同时处理客户端与meta的升级,中间有较长的hive离线时间,造成作业失败。

所以最终的实践措施是:
首先只升级 metastore server , 然后分部门升级每个部分的hive客户端, hive thrift server

image.png

准备:

准备升级之前,需要客户端进入灰度模式

关闭元数据VERISON校验相关功能:

<property><name>hive.metastore.schema.verification</name><value>false</value><description>Enforce metastore schema version consistency.True: Verify that version information stored in is compatible with one from Hive jars.  Also disable automaticschema migration attempt. Users are required to manually migrate schema after Hive upgrade which ensuresproper metastore schema migration. (Default)False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.</description>
</property>

配置禁止JDO框架来自动更新元数据schema:

<property><name>datanucleus.autoCreateSchema</name><value>false</value>
</property><property><name>datanucleus.fixedDatastore</name><value>true</value>
</property>

hive meta store 升级:

当 hive 客户端不再 check meta 版本信息时候, 我们再对 hive meta store 进行升级。

接下来分析 : hive meta store 的升级脚本:

经调研sql升级过程发现,hive新版本库主要做出的改变有:

  1. 创建新表。
  2. 增加原表的新字段。
  3. 扩展原列的长度,如表名。列名等。
  4. 新建存储过程

我们可以看下它的升级脚本

# add acid
# 创建各种事物表
source hive-txn-schema-0.13.0.mysql.sql# 0.13.0 -> 0.14.0
# create table PART_COL_STATS
# create index PCS_STATS_IDX on PART_COL_STATS
# set version 0.14.0
source upgrade-0.13.0-to-0.14.0.mysql.sql# 0.14.0 -> 1.1.0
# create table NOTIFICATION_LOG
# create table NOTIFICATION_SEQUENCE
# set version 1.1.0
source upgrade-0.14.0-to-1.1.0.mysql.sql# 1.1.0 -> 1.2.0
# set version 1.2.0
source upgrade-1.1.0-to-1.2.0.mysql.sql
# 1.2.0 -> 2.0.0
# create procedure RM_TLBS_LINKID
# create procedure RM_PARTITIONS_LINKID
# create procedure RM_LINKID
# ALTER TABLE `COLUMNS_V2` MODIFY `COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
# ===> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL
# ALTER TABLE `PART_COL_PRIVS` MODIFY `COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;
# ===>`COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# ALTER TABLE `TBL_COL_PRIVS` MODIFY `COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;
# ====>`COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# ALTER TABLE `SORT_COLS` MODIFY `COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;
# ===> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# ALTER TABLE `TAB_COL_STATS` MODIFY `COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
# ===> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL
# ALTER TABLE `PART_COL_STATS` MODIFY `COLUMN_NAME` varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
# ===> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL# 添加字段 : ALTER TABLE `COMPACTION_QUEUE` ADD `CQ_HIGHEST_TXN_ID` bigint;
# 添加字段 : ALTER TABLE `COMPACTION_QUEUE` ADD `CQ_META_INFO` varbinary(2048);
# 添加字段 : ALTER TABLE `COMPACTION_QUEUE` ADD `CQ_HADOOP_JOB_ID` varchar(32);
# 添加字段 : ALTER TABLE `TXNS` ADD `TXN_AGENT_INFO` varchar(128);
# 添加字段 : ALTER TABLE `TXNS` ADD `TXN_HEARTBEAT_COUNT` int;
# 添加字段 : ALTER TABLE `HIVE_LOCKS` ADD `HL_HEARTBEAT_COUNT` int;
# 添加字段 : ALTER TABLE `TXNS` ADD `TXN_META_INFO` varchar(128);
# 添加字段 : ALTER TABLE `HIVE_LOCKS` ADD `HL_AGENT_INFO` varchar(128);
# 添加字段 : ALTER TABLE `HIVE_LOCKS` ADD `HL_BLOCKEDBY_EXT_ID` bigint;
# 添加字段 : ALTER TABLE `HIVE_LOCKS` ADD `HL_BLOCKEDBY_INT_ID` bigint;
# create table COMPLETED_COMPACTIONS
# create table AUX_TABLE
# set version 2.0.0
source upgrade-1.2.0-to-2.0.0.mysql.sql# 2.0.0 -> 2.1.0
# create table KEY_CONSTRAINTS
# create table WRITE_SET
# create table
# 添加字段 : TXN_COMPONENTS
# 添加字段 : ALTER TABLE COMPACTION_QUEUE ADD CQ_TBLPROPERTIES varchar(2048);
# 添加字段 : ALTER TABLE COMPLETED_COMPACTIONS ADD CC_TBLPROPERTIES varchar(2048);
# set version : 2.1.0
source upgrade-2.0.0-to-2.1.0.mysql.sql# 2.1.0 -> 2.2.0
# 添加字段 : ALTER TABLE `TBLS` ADD `IS_REWRITE_ENABLED` bit(1);
# 设置字段 : UPDATE `TBLS` SET `IS_REWRITE_ENABLED` = false;
# 修改字段 : ALTER TABLE `TBLS` MODIFY COLUMN `IS_REWRITE_ENABLED` bit(1) NOT NULL;
# 添加字段 : ALTER TABLE `NOTIFICATION_LOG` ADD `MESSAGE_FORMAT` varchar(16);
# 修改字段 : ALTER TABLE `NOTIFICATION_LOG` MODIFY `MESSAGE` longtext; (1.1.0)
# ===> `MESSAGE` mediumtext
# 修改字段 : ALTER TABLE COLUMNS_V2 MODIFY TYPE_NAME MEDIUMTEXT;
# ==> `TYPE_NAME` varchar(4000) DEFAULT NULL
# 修改字段 : ALTER TABLE TABLE_PARAMS MODIFY PARAM_VALUE MEDIUMTEXT;
# ==> `PARAM_VALUE` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL,
# 修改字段 : ALTER TABLE SERDE_PARAMS MODIFY PARAM_VALUE MEDIUMTEXT;
# ==> `PARAM_VALUE` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE SD_PARAMS MODIFY PARAM_VALUE MEDIUMTEXT;
# ==> `PARAM_VALUE` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE TBLS MODIFY TBL_NAME varchar(256) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;
# ==> `TBL_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE NOTIFICATION_LOG MODIFY TBL_NAME varchar(256) CHARACTER SET latin1 COLLATE latin1_bin;
# ==> `TBL_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE PARTITION_EVENTS MODIFY TBL_NAME varchar(256) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;
# ==> `TBL_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE TAB_COL_STATS MODIFY TABLE_NAME varchar(256) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
# ==> `TBL_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE PART_COL_STATS MODIFY TABLE_NAME varchar(256) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
# ==> `TABLE_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL
# 修改字段 : ALTER TABLE COMPLETED_TXN_COMPONENTS MODIFY CTC_TABLE varchar(256) CHARACTER SET latin1 COLLATE latin1_bin;
# ==> CTC_TABLE varchar(128)
# 修改字段 : ALTER TABLE COLUMNS_V2 MODIFY COLUMN_NAME varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
# ==> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
# 修改字段 : ALTER TABLE PART_COL_PRIVS MODIFY COLUMN_NAME varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;
# ==> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE TBL_COL_PRIVS MODIFY COLUMN_NAME varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;
# ==> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE SORT_COLS MODIFY COLUMN_NAME varchar(767) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;
# ==> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE TAB_COL_STATS MODIFY COLUMN_NAME varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
# ==> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# 修改字段 : ALTER TABLE PART_COL_STATS MODIFY COLUMN_NAME varchar(767) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL;
# ==> `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
# set version 2.2.0
source upgrade-2.1.0-to-2.2.0.mysql.sql# 2.2.0 -> 2.3.0
# 添加索引 : CREATE INDEX TC_TXNID_INDEX ON TXN_COMPONENTS (TC_TXNID);
# set version : 2.3.0
source upgrade-2.2.0-to-2.3.0.mysql.sql

我们需要注意在2.1.0 升级到 2.2.0的脚本策略中,在TBLS表中添加了一个非空列IS_REWRITE_ENABLED,并将旧版本表中的所有这个字段的值设置为 false.
但是对于旧版的客户端在创建表时候, 并没有填充这个字段,导致客户端写数据库时候造成元信息插入失败:非空依赖

所以我们需要修改下这个升级脚本037-HIVE-14496.mysql.sql:

ALTER TABLE `TBLS` ADD `IS_REWRITE_ENABLED` bit(1) DEFAULT false;

这样就避免了老版本的非空依赖冲突可以对hive metastore升级了。

hive 客户端升级 :

当完成了 hive metastore 的升级之后就可以上 hive-2.3.3 客户端了。我们采用了分部门更新客户端环境,隔离升级的策略完成的升级。

升级过程主要发现的问题是:

  1. 新版hive对关键字的处理发生改变:

例如: select timestamp from table_name; 这种脚本需要对关键字做单独处理 <code>select `timestamp` from table_name;</code>

有关hive个版本保留关键字请参照 : LanguageManual DDL - Apache Hive - Apache Software Foundation

  1. hive 数据库连接池存在的问题:

我升级过程中原版hive使用的数据库连接池为BoneCP,使用升级之后发现这个连接池建立之后无法感知链接挂断事件,导致如果长时间没有操作重新查询会发生意外的连接断开异常。

调试之后我选择了 DBCP 连接池, 并且设置了测试存活sql.来避免链接被断开的问题。

<property><name>datanucleus.connectionPoolingType</name><value>DBCP</value><description>Uses a BoneCP connection pool for JDBC metastore</description></property>
<property><name>datanucleus.connectionPool.testSQL</name><value>select 1</value></property>
<property><name>datanucleus.connectionPool.maxPoolSize</name><value>4</value></property>
<property><name>datanucleus.connectionPool.minIdle</name><value>2</value></property>
  1. Hive 目的数据存在.hive-staging_hive_date-time_ XXX文件:

设置中间数据存放位置:

<!-- tmp dir --><property><name>hive.exec.scratchdir</name><value>/tmp/hive</value><description>Scratch space for Hive jobs</description></property>
<property><name>hive.exec.local.scratchdir</name><value>/tmp/${user.name}</value><description>Local scratch space for Hive jobs</description></property>
<property><name>hive.exec.stagingdir</name><value>/tmp/hive-staging/.hive-staging</value></property>

至此, hive 升级完成。并顺利完成上线。

Hive 版本升级记录(0.13.0 - 2.3.3)相关推荐

  1. NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0环境配置

    引言 DIGITS简介 DIGITS特性 资源信息 说明 DIGITS安装 软硬件环境 硬件环境 软件环境 操作系统安装 DIGITS安装前准备 安装CUDA70deb方式 安装cuDNN70 安装C ...

  2. Geary 0.13.0 发布,GNOME 3 Email 客户端应用

    百度智能云 云生态狂欢季 热门云产品1折起>>>   Geary 0.13.0 发布了,Geary 是一个电子邮件应用,用于 GNOME 3 桌面版本,它允许阅读.查找和发送电子,并 ...

  3. pandas python2.3版本_python-像以前的版本一样,将pandas 0.13.0“ pri...

    在新版的熊猫0.13.0中,数据框df使用以下格式打印在一长串数字中: df 要么 print df 而不是像以前那样的概述,现在只能使用 df.info() 是否可以将默认的" df&qu ...

  4. torch和torchvision对应版本(最新版,含有torchvision 0.13.0版本)

    torchvision - image:: https://pepy.tech/badge/torchvision :target: https://pepy.tech/project/torchvi ...

  5. 【Spark】IDEA sbt编译出错unresolved dependency: com.eed3si9n#sbt-assembly;0.13.0: not found

    IDEA sbt编译出错unresolved dependency: com.eed3si9n#sbt-assembly;0.13.0: not found sbt编译的时候报错: unresolve ...

  6. 金蝶天燕行政事业GKIS标准版10.0 金蝶天燕GKIS标准版V10.0 金蝶天燕V9.0 金蝶GKIS高级版9.0 金蝶KIS行政事业14.0 13.0 12.1 行政事业12.0 11.0 9.0

    金蝶天燕GKIS标准版V10.0 金蝶天燕行政事业GKIS标准版V10.0 金蝶天燕10.0标准版 金蝶天燕V9.0标准版 金蝶KIS行政事业版14.0 金蝶KIS行政事业13.0 12.1 12.0 ...

  7. VS2017连接MySQL数据库出错:Could not load file or assembly 'MySql.Data, Version=8.0.13.0, Culture=neutral

    一.下载Mmysql.data.8.0.13.nupkg文件 二.在VS2017中找到如下选项,将下面将会出现程序包管理器控制台 三.输入安装指令,如下图 安装成功即可

  8. windows安装mysql-community-8.0.13.0

    安装包下载 百度网盘: 链接:https://pan.baidu.com/s/1ulWh5ym7zJXekyYzJ05whQ  提取码:wl84  复制这段内容后打开百度网盘手机App,操作更方便哦- ...

  9. Hive 0.13 数据类型

    hive支持的数据类型路下 数值类型 Numeric Types TINYINT (1字节,数据范围: -128 to 127) SMALLINT (2字节,数据范围: -32,768 to 32,7 ...

最新文章

  1. hdu 2669 Romantic
  2. SSH分客户端openssh-client和openssh-server
  3. TCP/IP详解--学习笔记(8)-DNS域名系统
  4. Python 文件writelines() 方法和处理双层列表
  5. LeetCode 1027. 最长等差数列(DP)
  6. jmeter性能指标
  7. 数据结构、算法及应用 课内模板整理
  8. php测试号推送消息失败,用thinkphp5做微信公众号开发为什么关注推送消息回复不了一直提示服务器出现故障?...
  9. I2C 挂死,SDA一直为低问题分析
  10. 初中计算机授课教案模板,初中语文的教案模板(精选5篇)
  11. Could not resolve placeholder
  12. 数学中有因果关系吗?
  13. java业务场景-实现订单超时关闭等延时队列操作的几种方式
  14. github提交代码出现remote: Support for password authentication was removed on August 13, 2021.?
  15. python 如何将视频文件的语音转换为文字
  16. 云文件共享服务器,云文件共享服务器
  17. win11 任务栏显示所有图标 不需要任何插件 (win11 22h2 版本已失效)
  18. PPT2010中,如何让带圈的序号填充背景颜色?
  19. 如何查计算机名和用户名,电脑的用户名和密码怎么查看
  20. 画架构图没有好素材可不行

热门文章

  1. 2022.10.16 第二十六次周报
  2. Unity3D 从入门到放弃 ——巡逻兵 观察者模式
  3. 化繁为简,爆款语聊产品背后的业务逻辑
  4. 史上最伟大的女程序员,集智慧和美貌于一身
  5. 跟着大厂学数据分析!
  6. JS中的12种循环遍历的方法
  7. spring-@AliasFor注解
  8. Samsung/三星I569 root教程_方法
  9. Word VBA批量格式转换:docx转pdf、doc、rtf、txt以及反向转换
  10. 测试用例设计的八大要素