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参数。--先小表做实验,定时每天跑。
-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 &
如果方案2,数据量太大(10pb),做的太慢,考虑按照分区表迁移,先确定分区值。要客户提供,上次更新时间,表分区保留时间(比如最近3天,最近1星期),表总大小,最近分区大小,表名称。
然后我们根据这个推算(日增大,保留时间端,任务迁移不完的,比如只保留3天的,日增数据又高的,我就不放进去,这些表任务切换后一次性迁移),哪些表不放到每天增量脚本里。等任务切换一天跑完。