背景
CDH集群hive数据迁移到华为MRS大数据集群,其中CDH的表,是由spark sql自动创建的,底层文件也是parquet格式的snappy压缩文件。
步骤
1.hive命令
export table hivedb.tablename to 'hdfs路径';
导出数据以及表结构 到对应的hdfs路径 ,例如:export table reports.testtab to '/tmp/testtab';
2.数据迁移
如果两个集群能跨域访问,那么可以直接使用 hadoop distcp 命令进行数据迁移。
如果不能直接访问,那么:
- hdfs dfs -get /tmp/testtab localpath 将数据先get到本地
- tar -czvf testtab.tar testtab 然后打成tar包
- 将这个tar包转移到,能访问目标集群的机器,然后解压,将文件转移到目标hdfs上
数据导入
到了目标集群,先解压tar包 tar -zxvf testtab.tar
在上传 hdfs dfs -put testtab /tmp/
hive上,选中对应数据库,表不需要自己去创建,然后 import table mytab from '/tmp/testtab/'
数据迁移完成,hive上可以进行验证 select count(1) from mytab
解决的坑
再使用spark sql去读取,会报
java.lang.IllegalArgumentException: java.net.UnknownHostException: nameservice1
这个时候去show create table mytab
会发现SERDEPROPERTIES 属性,用的还是老的hdfs路径 'hdfs://nameservice1/hive/warehouse/reports.db/testtab'
所以这个属性需要重新修改:
alter table mytab set serdeproperties('path'='hdfs://hacluster/hive/warehouse/reports.db/mytab')
这样就可以了