1、假设客户只改了最近的分区。他不会去修改历史的分区表,如果大量改历史的分区表,那纯纯把hive当mysql用了。这样我们就只能找出变动的表,然后删除,重新迁移。
2、此处是确保他们不会大量改历史分区,只有少部分改(删除,重新迁移),但是他们会改最近分区,我们不能确保他的任务迁移过程中,修改了数据。所以这里我们删除的是最新分区的数据,然后在进行对表update(这样也可以把新增的表迁移过来)。
2个文件
一个是表名input.txt
a_table
b_table
....千张
一个是代码test.sh
代码如下
#!/bin/bash#1.删除目标端最新分区(防止被overwrite覆盖了)
while IFS= read -r table_namedodt_last=$(hdfs dfs -ls hdfs://xx.xx.xx.104:4007/apps/hive/warehouse/test.db/$table_name | grep 'dt=' | sort -r | head -n 1|awk -F ' ' '{print $NF}')#dt_last是hdfs长串的地址echo $dt_lastif [ -z "$dt_last" ]; thenecho "目标端为Null,通常没有迁移,$table_name是新表,不用删除"else# 在这里执行正常的操作echo "删除表: $table_name ,开始$dt_last"hdfs dfs -rm -r $dt_lastfi
done < "$1"#2.读取表,对他们进行update
echo "---hdfs最新分区删除成功,开始整表update---------"
while IFS= read -r table_name
dosource_path=hdfs://xx.xx.xx.7:8020/apps/hive/warehouse/test.db/$table_nametarget_path=hdfs://xx.xx.xx.104:4007/apps/hive/warehouse/test.db/$table_nameecho "更新表: $table_name"#2.distcp,update,delete迁移#手动指定分区echo "hadoop distcp -update -skipcrccheck -i -strategy dynamic -bandwidth 30 -m 20 $source_path $target_path"hadoop distcp -update -skipcrccheck -i -strategy dynamic -bandwidth 30 -m 20 $source_path $target_pathecho "完成$source_path到$target_path的增量更新" >> rs.txt
done < "$1"#3.修复分区
echo "---hdfs更新完成,开始修复分区---------"# 设置beeline的连接信息
BEELINE_CMD="beeline -u 'jdbc:hive2://xx.xx.xx.104:7001/cfc;principal=hadoop/xx.xx.xx.104@TBDS-xxxxxxxLE'"# 读取包含表名的txt文件
while IFS= read -r table_name
do# 执行MSCK REPAIR TABLE命令echo "Repairing partitions for table: $table_name"$BEELINE_CMD -e "MSCK REPAIR TABLE $table_name;"if [ $? -eq 0 ]; thenecho "Successfully repaired partitions for table: $table_name"elseecho "Failed to repair partitions for table: $table_name"fi
done < "$1"
#4.加入定时任务中T+2#单独的脚步
使用
sh test.sh input.txt