Hive 数据迁移与备份

迁移类型

  1. 同时迁移表及其数据(使用importexport
  2. 分步迁移表和数据
    1. 迁移表(show create table
    2. 迁移数据
    3. 关联表和数据(msck repair

迁移步骤

  1. 将表和数据从 Hive 导出到 HDFS
  2. 将表和数据从 HDFS 导出到本地服务器
  3. 将表和数据从本地服务器复制到目标服务器
  4. 将表和数据从目标服务器上传到目标 HDFS
  5. 将表和数据从目标 HDFS 上传到目标 Hive 库
  • 如果原始 HDFS 和目标 HDFS 集群连通,可使用 DiskCP 工具直接跨集群复制,而跳过2~4步

Hive 数据迁移与备份_第1张图片

实施过程

目标集群和服务器检查

df -lh # 查看本地空间使用情况
hadoop dfsadmin -report # 查看HDFS集群使用情况
hadoop fs -find / -name warehouse # 查找Hive库位置
hadoop fs -du -h /user/hive/warehouse # 查看Hive库占用

同时迁移表及其数据(使用importexport

  • export 工具导出时会同时导出元数据和数据
  • import 工具会根据元数据自行创建表并导入数据
  • 如果涉及事物表需要预先开启目标库的事物机制
-- 开启事务 
-- https://cwiki.apache.org/confluence/display/Hive/Hive+Transactions#HiveTransactions-Configuration
SET hive.support.concurrency = true;
SET hive.enforce.bucketing = true;				
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
SET hive.compactor.initiator.on = true;
SET hive.compactor.worker.threads = 1;

迁移步骤

## 源服务器

cat < /home/ap/lzy/hive_sel_tables.hql
use ;
show tables;
EOF

# 罗列要迁移的表清单
beeline -f /home/ap/lzy/hive_sel_tables.HQL \
| grep -e "^|" \
| grep -v "tab_name" \
| sed "s/|//g" \
| sed "s/ //g" \
> /home/ap/lzy/hive_table_list.txt

# 生成导出脚本
cat /home/ap/lzy/hive_table_list.txt \
| awk '{printf "export table .%s to |/tmp//%s|;\n",$1,$1}' \
| sed "s/|//g" \
| grep -v "tab_name" \
> /home/ap/lzy/hive_export_table.HQL

# 生成导入脚本
cat /home/ap/lzy/hive_table_list.txt \
| awk '{printf "import table .%s from |/tmp//%s|;\n",$1,$1}' \
| sed "s/|//g" \
| grep -v "tab_name" \
> /home/ap/lzy/hive_import_table.HQL

# 创建 HDFS 导出目录
hadoop fs -mkdir -p /tmp//

# 导出表结构到数据到 HDFS
beeline -f /home/ap/lzy/hive_export_table.HQL

## HDFS 集群连通时使用 DiskCP 进行拷贝
hadoop distcp hdfs://scrNmaeNode/tmp/hdfs://targetNmaeNode/tmp

## HDFS 集群不连通
hadoop fs -get /tmp//home/ap/lzy/ 
scp -r /home/ap/lzy/ root@targetAP:/home/ap/

## 目标服务器

# 创建 HDFS 导出目录
hadoop fs -mkdir -p /tmp//

# 上传到目标 HDFS
hadoop fs -put /home/ap/lzy/ /tmp

# 导入到目标 Hive
beeline -f /home/ap/lzy/hive_import_table.HQL

分步迁移表和数据

备份表

cat < /home/ap/lzy/hive_sel_tables.hql
use ;
show tables;
EOF

# 罗列要迁移的表清单
beeline -f /home/ap/lzy/hive_tables_sel.HQL \
| grep -e "^|" \
| grep -v "tab_name" \
| sed "s/|//g" \
| sed "s/ //g" \
> /home/ap/lzy/hive_tables_rst.HQL

# 生成DDL查询语句
cat /home/ap/lzy/hive_tables_rst.HQL \
| awk '{printf "show create table .%s ;\n",$1}' \
| sed "s/|//g" \
| grep -v "tab_name" \
> /home/ap/lzy/hive_table_ddl_sel.HQL

# 生成 DDL 查询结果
beeline -f /home/ap/lzy/hive_table_ddl_sel.HQL \
> /home/ap/lzy/hive_table_ddl_rst.HQL

迁移数据

通过 HDFS 复制数据

  • 这种方式无法备份外部表的数据
  • 保证迁移前后的HDFS数据目录一致
  • 数据迁移同样考虑集群连通时使用 Diskcp进行复制,不连通时先 GET 到本地,传到目标服务器侯 再 PUT 到 HDFS
/user/hive/warehouse/database.db/table_name # Hive 默认路径

# 跨HDFS集群复制
hadoop distcp hdfs://scrNmaeNode/user/hive/warehouse/database.db/ hdfs://scrNmaeNode/user/hive/warehouse/

通过 HiveQL 迁移数据

  • 需要预先构建表和分区
desc 表名;
show partitions 分区表名;
  • 这种方式适合表比较少,表结构不是很复杂的表的迁移
-- 导出数据到服务器
INSERT OVERWRITE LOCAL DIRECTORY "路径" 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
SELECT 字段1,字段2,... FROM ;

-- 导出数据到HDFS
INSERT OVERWRITE DIRECTORY "路径"
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
SELECT 字段1,字段2,... FROM ;

-- 导入数据
LOAD DATA LOCAL INPATH '/root/my/bookstore.txt' 
OVERWRITE INTO TABLE ;

关联表和数据

  • 关联前需要在目标库预先创建表
msck repair table 

参考:

​​​​​​​HIVE数据迁移

Hive中的数据迁移--迁移多库数据以及实际遇到的问题解决

你可能感兴趣的:(Hive,hive,big,data,hadoop)