昨天讲了 表结构的迁移,结合 shell 和 hive -e 和 hive -f 基本小试牛刀完成了, 重中之重 其实是数据 的迁移和 跨集群的数据定时备份
今天 讲数据迁移,依然使用的是最笨的方法 也是最有效的,
首先我们的表 是分区表, 比如有 client_nmbr batch 两个分区
,我们从A集群 导出,在导入到 B集群,都是批量导入,不可能每条鱼验证它是哪个分区的再插入,这样效率比较低,所以我们必须在 从A集群导出的时候就要 做好他是哪个分区的,根据分区 来生成一个单独的文件,这样我们在B集群导入的时候 就是 以文件件代表分区, 批量写入,
另外内,以后如果数据迁移成为一个定时任务要去备份的话,我们应该是 以增量备份,而不是全量备份,怎么判断增量呢,使用上面的两个字段 都无法做到,那我们就应该考虑 建在分区上该如何表示增量呢,答案是时间字段,假如我 3月20日备份过一次 ,一个月备份一次,那么我在4月20号 要备份的时候就要从3月21日新增的结果进行备份,这样增量可以标识出来,节省了 空间和时间
具体如何通过分区来备份呢,这个看hive为我们提供的几个命令
show tables;
show partitions tablename;
下面可以看看shell 的伪代码
#! /bin/bash
ex_dir=export_zip
mkdir ./$ex_dir
for table in `hive -e 'use fkdb,show tables'`;do
dirsub=_data;
mkdir -p ./$table$dirsub;
for partition in `show partitions $table`;do
#假设 partition=client_nmbr=AA108/batch=p1
cli_bat=`echo $partition |grep -o --color '[0-9]*'`
client_nmbr=${cli_bat[0]};
batch=${cli_bat[1]};
ex_file=$table$partition
touch ./$table$dirsub/$ex_file
hive -e 'select * from $table where client_nmbr=$client_nmbr and batch=$batch' >> ./$table$dirsub/$ex_file
zip_extension=.zip
zip -r ./$ex_dir/$table$dirsub$zip_extension ./$table$dirsub
通过这个shell 脚本 就可以批量导出 这些 表分区的数据文件 ,是不是很酷,
并且打包成zip文件
之后将这些文件上传到B 集群,通过 对文件名的正则匹配到分区后
使用 批量插入脚本 for 变量到 hive 仓库中