目前不同公司多多少少存在Hive数据库在不同集群间的数据迁移需求,我们只要在CDH新版本集群搭建完成之后,即可进行数据迁移工作,如下描述hive及HDFS数据的迁移。
一、源集群hive表结构的备份
写备份hive数据表ddl脚本如下,在源集群主节点服务器上执行。可自行放在/home/dw目录下:
!/bin/sh
for hive_database in "sjczq_db" "sjjsq_db"
do
sudo -u hive hive -e "use ${hive_database};
show tables;" > ${hive_database}_tables.txt
rm -f ${hive_database}_tablesDDL.txt
cat ${hive_database}_tables.txt |while read eachline
do
sudo -u hive hive -e "use ${hive_database};
show create table $eachline;" >>${hive_database}_tablesDDL.txt
echo ';' >> ${hive_database}_tablesDDL.txt
dones
cone
将导出相应的hive的DDL语句,修改一下对应的path和location为新集群的主节点名称。
如下图所示:
将调整后的DDL语句在新集群环境执行。
由于hive数据库是逐个迁移的,请事先创建好hive数据库;
二、新老集群hive&HDFS数据文件迁移
distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具
distcp最常用在集群之间的拷贝:
sudo -u hive hadoop distcp hdfs://192.168.201.83:8020/user/hive/warehouse/sjczq_db.db/* hdfs://192.168.220.63:8020/user/hive/warehouse/sjczq_db.db
注意: (1) distcp使用绝对路径进行操作;
(2) 该命令需要在目标集群上执行;
(3) 为了保持hive数据文件权限问题,请使用sudo -u hive用户执行;
(4) -overwrite参数谨慎使用,可不指定操作类型,采用默认即可,若目标文件存在,存在跳过,否则进行同步复制;
这条命令会把集群的/user/hive/warehouse/sjczq_db.db目录下的所有文件或目录名展开并存储到一个临时文件中,这些文件内容的拷贝工作被分配给多个map任务, 然后每个TaskTracker分别执行从83到63的拷贝操作。
若命令中断,可再次执行,不影响之前迁移同步数据表。
三、迁移后数据验证
针对迁移同步后的数据表直接查询,查看数据量及数据字段值是否一致;
1、全量表数据,直接同步即可,数据验证没有问题
2、分区数据表,查询发现数据为空,但是HDFS文件数据已迁移同步
此时需要使用msck repair table new_table;修复新表的分区元数据
修复后分区表正常。
至此hive数据库迁移完成。
网友评论