hive数据迁移

发布于:2025-02-10 ⋅ 阅读:(106) ⋅ 点赞:(0)

hive迁移总共2部分,或者3部分

必要

1、hive元数据迁移(mysql的hive表迁移)
2、hdfs实际数据迁移(distcp)

可能需要

3、分区表需要在前2部迁移后(进行分区修复)

迁移前准备

迁移mysql,保证2边的hdfsservice的location相同

迁移hdfs前要设定计划,假设数据1PB,里面有很多大表,最好能统计每个表的数据量以及大小

hdfs dfs -du -s -h /user/hadoop/data

制定计划,进行分步骤迁移(小表直接按目录迁移,大表分区迁移)

预估迁移速度。假设宽带是万兆带宽,10Gb,算上损耗,实际应该是1GB/s,如果业务占用750mb/s,那么剩余的还有250mb/s。此时给5个map,每个map 带宽50mb/s

假设有100g的一张表,那么最快速度是400秒跑完,算上实际mapreduce以及校验,+70%。大概是700秒。11分钟左右。
实际测试确实是11分钟到12分钟。不进行参数优化,耗时大概是迁移网速带宽的导入数据实际 * 170%

将客户要迁移的表,整理一个文档,写好

表名,表路径,表数据量,责任人,是否业务常用分数,是否为临时表

加跳过测试,在distcp后面加上这个-skipcrccheck -i (-skipcrccheck跳过crc校验--意思是即使前在迁移过程中变动,也会迁移完成,适合离线全量迁移后面在停机补少量的增量数据,-i是忽略失败)

hive表迁移:

hive有2种表方式,磁盘和关系型数据库,一般我们都是用mysql,2者操作一样。

磁盘scp,mysql的话将mysql的hive库和表同步过去。

同步方式很多,导出sql,用工具navicat,同步脚本。这里就不写具体方式, 比较简单。

HDFS迁移

停机方式(简单)

hive数据迁移:

hive有2种存储方式,存磁盘或者hdfs,2者操作一样,磁盘就scp过去。

hdfs就distcp过去。

hadoop distcp -Dmapreduce.job.hdfs-servers.token-renewal.exclude="xx.xx.xx.xx" -i -strategy dynamic -log /hdfs_migration/None/日志路径 -bandwidth 100 -m 100 hdfs://xx.xx.xx.xx:8020/user/hive/warehouse/xx.db/table_name/* hdfs://xx.xx.xx.xx2:8020/user/hive/warehouse/xx.db/table_name/* 

这段代码的意思是

-Dmapreduce.job.hdfs-servers.token-renewal.exclude 设置HDFS服务器的配置,排除指定的IP地址以避免进行令牌续期。

-i: 表示在复制过程中忽略已存在的文件,不覆盖目标目录中的文件。

-strategy dynamic: 使用动态策略,根据输入数据量和集群资源动态调整任务的映射器数量,以优化复制性能。

-log /hdfs_migration/指定存放操作日志的路径

-bandwidth 100 -m 100 代表每个map传送的宽带是每秒100mb,-m指的是 启动100个map

不停机

方案如下:

在上面的迁移上加,-skipcrccheck进行迁移。

这样就能完成全量迁移

找个源端表不写入不更新候,进行增量迁移,上述distcp加个-update参数


分区修复

如果原表有分区,那么需要在迁移后的表,迁移数据后,进行分区修复。

进入迁移后的hive后输入

msck repair table xxx

如果一张表是10T以上,万兆宽带10Gb每秒,在宽带全占用的情况下1GB/s

1小时迁移=1g*60s*60min=3.6T

10t数据需要几小时迁移=10T/1小时迁移量=10T/3.6=2.7小时

按照实际情况map-reduce以及合并,需要额外百分之70的时间=迁移时间*0.7=1.94小时

10T数据总迁移时间约=迁移时间+额外合并时间=2.7+1.94=4.64小时

分区修复大概占这个时间的百分之50=4.64x0.5=2.32小时

10T要修复分区要2.32小时。所以这时候需要手动修复。手动修复大概就5分钟。

大表手动修复分区地址:hive迁移后修复分区慢,怎么办?-CSDN博客

如果迁移失败,导致没有元数据,那么需要重新建表。

先查看原表的结构,在原来的hive里或者beeline中。

show create table xxx

然后通过脚本导出为不带边框的表sql

beeline --showHeader=false --outputformat=dsv -e "show create table 库名.表名" > /xx.sql

然后进入迁移后的表,迁移数据后,进入hive在将这个建表sql建立一下。


任务割接,增量迁移

由于在任务割接的时候,客户做不到停机,任务也会有依赖。

1、mysql元数据,每天增量同步。如果hive的表被改了(手动修改下表格式就行)

检测源端所有的表(show tables脚本),是否在目标端存在,存在则不管,不存在则获取建表语句(show create table xxx)。

在目标端hive进行执行

2、hdfs迁移,预估增量更新速度够不够快(扫描1PB的速度怎么样),hive的任务都是依赖昨天的表。当天能不能扫完和迁移完,distcp -update和delete参数。--先小表做实验,定时每天跑。

不停机和任务(T-1):
生产环节谨慎操作:先从源端复制一份历史数据做备份,然后迁移这个备份的数据
命令中间都是空格
nohup hadoop distcp 
-skipcrccheck -i
-strategy dynamic  
-m 20 -bandwidth 35 -update -delete
hdfs://源端ip:8020/apps/hive/warehouse/ab.db/a
hdfs://目标端:4007/apps/hive/warehouse/ab.db/a > /home/hadoop/copy-update-distcp.log 2>&1 &
后面,要用户自己用昨天的数据跑当天数据
这个update delete的速度扫描,比迁移还慢--改namenode heapsize为64G
--update的速度很快 ,我测试了10G的表,大概50秒迁移完。
我测试了7000G的表,大概8分钟。(机器是64核,256Gx12台,宽带是万兆)
停任务迁移,如果是确保没有任务写入
可以将上面的-skipcrccheck和-i删掉,加 -Ddfs.checksum.combine.mode= COMPOSITE_CRC
直接切任务就行
任务校验,选择update一个指定分区,然后让用户用任务去源端和目标端都跑一次,对比任务跑出来的结果。校验脚本可以在我的博客里面搜,有这个

如果方案2,数据量太大(10pb),做的太慢,考虑按照分区表迁移,先确定分区值。要客户提供,上次更新时间,表分区保留时间(比如最近3天,最近1星期),表总大小,最近分区大小,表名称。

然后我们根据这个推算(日增大,保留时间端,任务迁移不完的,比如只保留3天的,日增数据又高的,我就不放进去,这些表任务切换后一次性迁移),哪些表不放到每天增量脚本里。等任务切换一天跑完。


网站公告

今日签到

点亮在社区的每一天
去签到