Hive 数据迁移与备份
迁移类型
同时迁移表及其数据(使用
import
和export
)分步迁移表和数据
迁移表(
show create table <tab_name>
)迁移数据
关联表和数据(
msck repair
)
迁移步骤
将表和数据从 Hive 导出到 HDFS
将表和数据从 HDFS 导出到本地服务器
将表和数据从本地服务器复制到目标服务器
将表和数据从目标服务器上传到目标 HDFS
将表和数据从目标 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库占用
同时迁移表及其数据(使用import
和export
)
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>
参考:
目录 返回
首页