Hive 数据迁移与备份

迁移类型

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

迁移步骤

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

实施过程

目标集群和服务器检查

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 <<EOF > /home/ap/lzy/hive_sel_tables.hql
use <db_name>;
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 <db_name>.%s to |/tmp/<db_name>/%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 <db_name>.%s from |/tmp/<db_name>/%s|;\n",$1,$1}' \
| sed "s/|//g" \
| grep -v "tab_name" \
> /home/ap/lzy/hive_import_table.HQL

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

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

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

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

## 目标服务器

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

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

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

分步迁移表和数据

备份表

cat <<EOF > /home/ap/lzy/hive_sel_tables.hql
use <db_name>;
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 <db_name>.%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 <table_name>;

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

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

关联表和数据

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

参考:

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

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

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值