Hive跨集群和版本迁移

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: Hive跨集群和版本迁移

公司重新搭建CDH6.3.0,并把旧集群Hive1.1迁移新集群Hive2.1,记录一下过程。

一. 迁移Hive数据和MySQL中的matastore

通过DistCp拷贝Hive数据到新集群,并从MySQL中导出Hive的元数据上传到新集群,最后在新集群MySQL中导入Hive元数据,并更新Hive版本,修改信息。

1. 迁移Hive数据和MySQL中的matastore

版本差异大,使用htfp

hadoop distcp -skipcrccheck -update htfp://hadoop-master-001:50070/user/hive/* \
hdfs://cdh-master-001:8020/user/hive
#因为从Hadoop2.6迁移到Hadoop3.0版本,使用hftp方式。
#源集群的格式是 hftp://<dfs.http.address>/<path> ,默认设置dfs.http.address是 <namenode>:50070。
#新的webhdfs协议代替了hftp后,源地址和目标地址都可以使用http协议webhdfs,可以完全兼容 。
hadoop distcp -skipcrccheck -update webhdfs://hadoop-master-001:50070/user/hive/* \
webhdfs://cdh-master-001:50070/user/hive

2. 在源集群上MySQL导出Hive metastore

mysqldump -uroot -p123456 --databases hive > mysql_hive.sql
#--skip-lock-tables,导出时会锁定所有表,如果不锁表,一边导出一边录入数据,会出问题

3. 在新集群使用Hive用户导入metastore

mysql -uhive -p123456 --default-character-set=utf8  hive < mysql_hive.sql

4. 升级Hive库

Hive版本相同不用升级。要根据版本序列升级,不能跨版本。

mysql -uroot -proot risk -hcdh-master < mysqlupgrade-1.1.0-to-1.2.1.mysql.sql
mysql -uroot -proot risk -hcdh-master < mysqlupgrade-1.2.1-to-2.0.0.mysql.sql
mysql -uroot -proot risk -hcdh-master < mysqlupgrade-2.0.0-to-2.1.1.mysql.sql

5. 修改metastore的集群信息

如果新集群名字跟源集群相同可以不用修改,否则需要修改hive库的DBS和SDS表内容。

#查看HDFS上数据存放位置
use hive;
select * from DBS;
update DBS set DB_LOCATION_URI = replace(DB_LOCATION_URI,
'hdfs://hadoop-master-001:8020',
'hdfs://cdh-master-001:8020') ;
update SDS set LOCATION = replace(LOCATION ,
'hdfs://hadoop-master-001:8020',
'hdfs://cdh-master-001:8020') ;

二. export / import + distcp

使用export将Hive表及元数据文件导出到HDFS文件系统,通过Distcp命令将导出的元数据文件迁移到新集群的HDFS文件中,最后在新集群中通过import命令导入表。

1. 导出Hive数据到HDFS

导出的数据包括_metadata和data文件夹,如果有分区,data为分区文件夹

#!/bin/bash
##自动导出hive表到HDFS
#输入数据库
DB=$1
#获取hive建表语句
tables=$(hive -e "use $DB; show tables;")
# echo "============== 开始生成hive-export.hql =============="
hive -e "use $DB;show tables" | awk '{printf "export table %s to |/tmp/bak/hive-export/%s|;\n",$1,$1}' \
| sed "s/|/'/g" > /user/bak/hive/hive-export.hql
# echo "============== hive-export.hql生成成功! =============="
# echo "================== 开始导出hive数据 =================="
hive -database $DB -f "/hadoop/bak/hive/hive-export.hql"
# awk{printf "|%s|",$1},管道符两个竖杠用于指示格式的起始与结束,$1替换%s,\n换行符结尾
# sed "s/|/'/g",sed s/被替换内容/替换内容/,g(GLOBAL)全部替换,无g只替代每行第一个

2. 拷贝导出的Hive数据到新集群

注意:导出数据之前,需要先确认hive的数据格式是orc还是parquet格式,因为orc格式hive的高版本不兼容低版本

原集群是CDH5.7、Hadoop2.6、HDFS端口50070,新集群是CDH6.3.0、Hadoop3.0、HDFS端口9870。采用webhdfs协议传输,记得原集群HDFS集群需要添加新集群服务器的host。

hadoop distcp webhdfs://hadoop-master-001:50070/tmp/hive-export/ \
webhdfs://cdh-master-001:9870/tmp/hive-export/

3. 修改导出脚本为导入脚本

cp hive_export.hql hive_import.sql
sed -i 's/export table/import table/g' hive-import.hql
sed -i 's/ to / from /g' hive-import.hql

4. 上传导入脚本后在新集群执行

hive -database cp_data -f hive-import.sql

三、数据迁移(因为新集群和阿里云的对象存储打通了,所以我的数据都放到了oss上)

1.按项目迁移代码

----------------------格式转换后台shell脚本
#!/bin/bash
echo 'start'
for t in `cat flag.txt` #同一行中的内容如果有空格,会被拆分成多个
do
  echo "$t"
  table=$t
  echo '' >./$table.sql
  echo '
use tools;
set spark.dynamicAllocation.enabled=false;--关闭executor动态分配功能,防止单个任务分配的资源太多
set spark.executor.instances=3;--设置可用的executor个数(3个)
set spark.executor.cores=5;--设置executor拥有的core数(5C)
set spark.executor.memory=8000000000b;--设置executor拥有的内存数(8G)
set mapreduce.map.memory.mb=3072;
set mapreduce.reduce.memory.mb=3072;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=10000;
set hive.exec.max.dynamic.partitions=10000;
set hive.exec.max.created.files=10000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set mapred.max.split.size=50000000;
set mapred.min.split.size.per.node=50000000;
set mapred.min.split.size.per.rack=50000000;
  ' >>./$table.sql
  echo "insert overwrite table ${table}_tran partition(pt) select * from $table;" >>./$table.sql
done
echo 'end'
--------------------------------把hdfs文件从老集群迁移到新集群--------------------------------
--在新集群worker节点上执行
--删除新集群上的路径
#!/bin/bash
echo 'start'
for t in `cat move_flag.txt` #同一行中的内容如果有空格,会被拆分成多个
do
echo "$t"
table=$t
hadoop distcp hdfs://hadoop-master-001:50070/group/user/tools/meta/hive-temp-table/${table}_tran/* oss://bigdata/group/user/tools/meta/hive-temp-table/${table}
done
echo 'end'
nohup ./move.sh &> move.log &
nohup ./move2.sh &> move2.log &

2.重新建表及导入数据

--重新创建表
drop table if exists xxx;
create external table if not exists xxx (
`xxx` string comment 'xxx',
`xxx` string comment 'xxx'
`xxx` string comment 'xxx',
`xxx` string comment 'xxx',
`xxx` string comment 'xxx',
`xxx` string comment 'xxx',
`xxx` string comment 'xxx',
`xxx` string comment 'xxx'
)
comment 'xxx'
PARTITIONED BY (pt STRING)
row format delimited
fields terminated by '\001'
lines terminated by '\n'
STORED AS parquet tblproperties ("orc.compress"="SNAPPY");
ALTER TABLE dwm_sony_app_opt_cd SET SERDEPROPERTIES('serialization.null.format' = '');
--修复分区
MSCK REPAIR TABLE xxx;
show partitions xxx;
select * from xxx limit 1;
--删除数据
hdfs dfs -rm -r -skipTrash hdfs://hadoop-master-001:50070/group/user/tools/meta/hive-temp-table/xxx
drop table xxx;
--如果有clickhouse的导出任务,那么conf文件中的orc格式要修改为parquet格式
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL 分布式计算 HIVE
基于Docker搭建大数据集群(六)Hive搭建
基于Docker搭建大数据集群(六)Hive搭建
|
SQL 分布式计算 资源调度
阿里云MaxCompute-Hive作业迁移语法兼容性踩坑记录
阿里云MaxCompute-Hive作业迁移语法兼容性踩坑记录
1862 0
|
SQL 前端开发 Java
大数据平台底层技术-JAVA篇-如何动态加载不同版本的 HIVE JDBC 驱动 - 一文读懂JAVA的类加载机制 1
大数据平台底层技术-JAVA篇-如何动态加载不同版本的 HIVE JDBC 驱动 - 一文读懂JAVA的类加载机制
|
10月前
|
SQL DataX HIVE
【YashanDB知识库】DataX迁移Hive到崖山分布式
本文来自YashanDB官网,介绍通过DataX将Hive数据迁移到YashanDB的实现方法。源环境为Hive 3.1.3,目标为YashanDB 23.2.3.100。文章提供了Hive与YashanDB的建表脚本、数据类型映射及DataX配置示例,包含reader和writer插件参数设置,并通过`datax.py`执行同步任务。内容详尽展示了数据迁移的全流程。
【YashanDB知识库】DataX迁移Hive到崖山分布式
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
384 3
|
SQL 存储 分布式计算
Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行
Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行
267 3
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
327 3
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
295 2
|
SQL 存储 数据管理
Hadoop-15-Hive 元数据管理与存储 Metadata 内嵌模式 本地模式 远程模式 集群规划配置 启动服务 3节点云服务器实测
Hadoop-15-Hive 元数据管理与存储 Metadata 内嵌模式 本地模式 远程模式 集群规划配置 启动服务 3节点云服务器实测
239 2
|
SQL Java 大数据
大数据平台底层技术-JAVA篇-如何动态加载不同版本的 HIVE JDBC 驱动 - 一文读懂JAVA的类加载机制 2
大数据平台底层技术-JAVA篇-如何动态加载不同版本的 HIVE JDBC 驱动 - 一文读懂JAVA的类加载机制