hive的数据迁移一般需要考虑多个部分。
1.元数据怎么迁移
2.数据怎么迁移
3.迁移过后元数据和数据怎么产生关联
1.元数据迁移
元数据迁移是非常重要的一部分,目前常用的迁移方法,大致上有两种,一个是,show create table获取创建table的sql语句,然后在新集群的hive上面执行对应的hive语句,创建表。第二个是使用import,import命令不仅仅可以迁移元数据,也迁移数据的,它会把元数据生成在一个文件里面,数据,直接的拷贝到import指定的文件夹里面。
下面,将两种方法使用脚本的方式都演示一遍,
以下所有的表都是在叫test的database里面
1.show create 方法。
#!/bin/bash
# 打印database下面的表
hive -e "use $1;show tables;" > $1.txt
sed -i '1d' $1.txt
# 遍历表,获取他们的ddl语句
cat tables.txt |while read line
do
hive -e "use $1;show create table $line" >> create_tables.txt
echo ";" >> tablesDDL.txt
done
现在执行获取到的ddl文件,注意,对应的test的database需要先创建出来,在新集群上面执行下面的语句。
hive -f create_tables.txt
到这里元数据已经完成了迁移。
2.使用import的方式进行元数据的迁移
这里也是书写脚本
#!/bin/bash
# import是针对表的mingl,所以这里创建存储表数据和元数据的hdfs文件夹
mkHdfsDir(){
hdfs dfs -test -e /test/$1/$2
if [ $? -eq 0 ] ;then
hdfs dfs -rm -r -f /test/$1/$2
hdfs dfs -mkdir -p /test/$1/$2
else
hdfs dfs -mkdir /test/$1/$2
fi
}
# 打印对应的datbase所有表
hive -e "use $1;show tables;" > $1.txt
#打印出来的第一行是 table_name,要进行删除
sed -i '1d' $1.txt
# 遍历所有的表,export数据,这里的$1是你要导出的database
cat $1.txt | while read line
do
mkHdfsDir $1 $line
echo "---------------------- export db $1 table $line ------------------------"
hive -e "use $1; export table $line to '/test/$1/$line';"
done
2.数据的迁移
对于数据的迁移,常用的也是两种办法,区别在于两个集群是否联通,如果联通的话,可以使用hadoop distcp的方式来进行数据迁移,如果网络不联通的话,可以先,get到本地,然后经由本地上传到新的hadoop集群
1.网络联通
hadoop distcp -skipcrccheck -update hdfs://linux121:9000/test hdfs://linux122:9000:/test
-skipcrccheck 省略crc检查,如果hadoop版本一样,可以不加,如果低版本向高版本迁移的话,最好带上
-update 增量更新,通过文件名称,大小比较,源文件和目标文件不同则更新
2.网络不联通
hdfs sdf -get /test
# 压缩减少传输
tar -zcvf /test test.tar.gz
#解压
tar -zxvf test.tar.gz -C /test
# 上传到目标hadoop集群
hdfs dfs -put /test /test
3.元数据和数据产生关联
这一步取决于上面两边分别使用了什么。
- 元数据使用show create table的方式,数据可以使用 hadoop distcp,这里注意表的目录和文件的目录要和之前的集群的保持一致,然后使用 msck方式分区修复
# 表会自动的扫描对应文件夹里面的数据,将其写到元数据里面,产生关联
msck repair table <tableName>
2.元数据使用show create table的方式,数据可以使用 export的方式,这个时候,应为表以建立好,使用import的方式,会把数据加载到创建表的文件夹里面,自动的产生关联
use test;
import table 表名 from /test/<tableName>;
3.元数据使用export的方式,这里可以知己的使用import恢复数据,比较推荐的是这一种
#!/bin/bash
# 遍历所有的表,import数据
cat $1.txt | while read line
do
echo "---------------------- import db $1 table $line ------------------------"
hive -e "use $1;import table $line from '/test/default/$line';"
done
下面进行一个总结
hive数据迁移的,其实可以用很多种方法,但是有的方法并不是最好的方法,更具不同的情况和数据量,选择的方法也是不同的,每种方法的优势也是不同的
在数据量正常的情况下,一般常用的方案是,使用import进行数据和元数据的导出,然后数据的传输看两个集群是否连接,使用 hadoop distcp或是下载到本地都是可以的。传输到新的hadoop集群之后,使用编写import脚本进行数据的加载,执行完成之后,数据就完全的在新的集群里面了。
这里推荐使用import和export组合是有原因的,export会将数据和元数据写到一起,并且元数据在恢复的时候,是直接的关联数据的,不需要做其他的事情,还有是直接的关联分区的,不需要使用的msck进行分区的修复的。需要注意的一点的是,import和export在进行数据的恢复的时候,只是关注到表层的文件夹,不用和旧集群的文件路径一摸一样的。
以上就是本篇文章的内容。