Hive数据迁移方案:
- 先通过shell脚本将集群1中hive的数据导入到hdfs中
- 将集群1的hdfs中的数据下载在本地
- 将集群1的本地数据发送到集群2的本地上;
- 将集群2的本地的数据导入到集群2的hdfs上;
- 将集群的hdfs上的数据导入到hive中。
步骤:
1.对集群1节点与集群2节点进行免密登录
[root@节点1 .ssh]# ssh-keygen -t rsa
[root@节点1 .ssh]# ssh-copy-id 节点2地址
[root@ 节点2 .ssh]# ssh-keygen -t rsa
[root@节点2 .ssh]# ssh-copy-id 节点1地址
2.将集群1的hive下载到本地并发送到集群2的hive上
[节点1 bin]# vim脚本名称
#!/bin/bash #将集群1的hive数据导入到集群1的hdfs,此处注意使用的队列,尝试了其他队列任务失败 hive -e "set mapreduce.job.queuename=kdid5134a7c0789b6bde79a5fa3275ba9addefault;export table 库名.表名 to 'hdfs文件路径'" #集群1的hdfs数据下载到本地节点1 hadoop fs -get hdfs文件路径 本地路径 #将节点1的本地数据传输到节点2的本地 xsync 节点2的地址 #将集群1的hdfs数据删除 hadoop fs -rm -r 集群1的hdfs文件路径 #将节点1本地信息删除 rm -rf 本地文件路径 #将节点2的本地数据上传到集群2的hdfs ssh 节点2地址 "hadoop fs -put -p 集群2 hdfs存储路径" #将集群2的hdfs数据导入到hive表 ssh 节点2地址 "/bin/inputhive.sh" |
Path:节点1:/bin/xsync |
#!/bin/bash #xsync用于异地数据传输 #1. 判断参数个数 if [ $# -lt 1 ] then echo Not Enough Arguement! exit; fi #2. 遍历集群所有机器 for host in 10.10.3.67 do #3. 遍历所有目录,挨个发送 for file in $@ do #4 判断文件是否存在 if [ -e $file ] then #5. 获取父目录 pdir=$(cd -P $(dirname $file); pwd) #6. 获取当前文件的名称 fname=$(basename $file) ssh $host "mkdir -p $pdir" rsync -av $pdir/$fname $host:$pdir else echo $file does not exists! fi done done |
Path: 节点2/bin/inputhive.sh |
#!/bin/bash #如果要导入的表存在则删除该表 hive -e "drop table if exists 库名.表名" #集群2的hdfs数据导入到hive表,注意此处导入的外部表,如果不添加external导入失败(没有要求外部表的可以忽略) hive -e "import external table 库名.表名 from 'hdfs存储路径'" #删除节点2的本地数据 rm -rf 节点2本地数据路径 |
使用方法:在节点1运行脚本