图片来自enterdesk
Hive的迁移涉及两个技术点:
1. 仅迁移元数据(参考网易云提出的思路,hive 元数据迁移与合并);
2. 元数据及Hive数据全量迁移。
考虑到多数场景是迁移整个Hive数据库,该篇文章只介绍迁移的第二种,即元数据及Hive数据全量迁移。
这里使用的export/import这两个指令。
主要的流程:
1. 将旧集群的hive数据导出至其hdfs中
2. 将旧集群hdfs中的导出数据下载到本地中
3. 将本地的导出数据上传至新的集群hdfs中
4. 将新集群hdfs中的数据导入至新集群中的hive中
● 将旧集群的hive数据导出至其hdfs中
1 数据导出1.1 设置hive启动默认数据库在家目录中新建.hiverc文件,配置默认的数据库(即你需要导出的数据库)
vim ~/.hivercuse export_db;
1.2 在hdfs上创建导出目录hdfs dfs -mkdir -p /tmp/export_db_export
1.3 导出旧集群的hive数据1.3.1 生成导出脚本hive -e "show tables;" | awk '{printf "export table %s to |/tmp/export_db_export/%s|;\n",$1,$1}' | sed "s/|/'/g" | grep -v tab_name > ~/export.hql
1.3.2 导出数据hive -f ~/export.hql
● 将导出的数据下载到本地
2 数据中转下载数据hdfs dfs -get /tmp/export_db_export ~/export_db
● 将本地的导出数据上传至新的集群hdfs中
3 数据迁移前提:已将导出的数据目录迁移至新集群
上传数据hdfs dfs -put ~/export_db /tmp/export_db_export注:这里的/tmp/export_db_export需要提前创建
● 将新集群hdfs中的数据导入至新集群中的hive中
4 数据导入4.1 生成导入脚本我们将之前的export.hql脚本修改下就可以当做我们的import.hql脚本
cp ~/export.sql ~/import.sqlsed -i 's/export /import /g' ~/import.sqlsed -i 's/ to / from /g' ~/import.sql
4.2 导入数据4.2.1 这里也需要设置hive的默认数据库vim ~/.hivercuse import_db;
4.2.2 导入数据hive -f ~/import.sql至此Hive数据的迁移就完成.
在部分有安全控制的集群环境下,hive连接被禁用了。这时候需要使用beeline连接hive并进行数据迁移,下面给大家介绍下如何使用beeline来进行数据迁移
1) 使用beeline进行导出脚本的生成beeline -u jdbc:hive2://cdh01:10000 -e "use export_db;show tables;"| awk '{printf "export table %s to |/tmp/export_db_export/%s|;\n",$2,$2}' | sed "s/|/'/g"|sed '1,3d'|sed '$d' > ~/export.hql
2) 执行导出脚本sed -i '1i use export_db;' ~/export.hqlbeeline -u jdbc:hive2://cdh01:10000 -n hdfs -f ~/export.hql
3) 这里使用distcp来进行hdfs文件在新集群的上传hadoop distcp hdfs://cdh01:8020/tmp/export_db_export/ hdfs://cdh02:8020/tmp/export_db_export新的集群hdfs目录需要提前创建
4) 修改import.hqlcp ~/export.hql ~/import.hqlsed -i 's/export /import /g' ~/import.hqlsed -i 's/ to / from /g' ~/import.hqlsed -i '1d' ~/import.hqlsed -i '1i use import_db;' ~/import.hql
5) 导入数据create database import_db;beeline -u jdbc:hive2://cdh02:10000 -n hdfs -f ~/import.hql
至此数据迁移完成