虚拟化容器,大数据,DBA,中间件,监控。

Hive 数据迁移与备份

06 11月
作者:admin|分类:大数据

迁移类型

  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/dip/lzy/hive_sel_tables.hql
use <db_name>;
show tables;
EOF

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

# 生成导出脚本
cat /home/ap/dip/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/dip/lzy/hive_export_table.HQL

# 生成导入脚本
cat /home/ap/dip/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/dip/lzy/hive_import_table.HQL

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

# 导出表结构到数据到 HDFS
beeline -f /home/ap/dip/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/dip/lzy/ 
scp -r /home/ap/dip/lzy/ root@targetAP:/home/ap/dip/

## 目标服务器

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

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

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

分步迁移表和数据

备份表

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

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

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

# 生成 DDL 查询结果
beeline -f /home/ap/dip/lzy/hive_table_ddl_sel.HQL \
> /home/ap/dip/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中的数据迁移--迁移多库数据以及实际遇到的问题解决

浏览456 评论0
返回
目录
返回
首页
记一次Kafka消费者频繁分区再均衡bug解决 《kafka问答100例 -7》如果Topic删除过程中有某台Broker宕机,删除流程会正常进行吗 ? |文末送书