hive数仓数据跨集群迁移

当前集群是在局域网环境,按要求要迁到阿里云集群上(阿里云的服务器,自己搭建的大数据集群),所以要把hive中的数仓数据迁移到新的集群上。

前提

hive有export和import命令(该功能是从hive0.8开始才有的),可以将hive表中的表结构和数据导入和导出。

1、export命令

EXPORT TABLE tablename [PARTITION (part_column="value"[, ...])] TO 'export_target_path'

2、import命令

IMPORT [[EXTERNAL] TABLE new_or_original_tablename [PARTITION (part_column="value"[, ...])]]  FROM 'source_path'  [LOCATION 'import_target_path']

所以,总共分三步:

  1. 将源数仓中的数据使用export命令导出到源hdfs上;
  2. 将源hdfs上的hive元数据传输到目标hdfs上;
  3. 使用import命令将目标hdfs上的元数据导入到目标hive中;

导入和导出好说,直接使用命令就可以了,问题的关键就是第二步元数据的传输;

1、使用distcp

hadoop distcp  源hdfs路径  目标hdfs路径

hive数据最终是存储在hdfs上的,所以我们只需需要注意的是,distcp命令是需要在目标集群的机器上执行,然后去源集群上去拉取,这里就有个问题:我的源集群是在局域网环境,在阿里云的集群上是访问不到的,所以这个命令就无法使用,该方案pass。

2、传统scp命令传输

这里又可以分三步:

  1. 将源hdfs的数据使用copyToLocal命令转储到本地服务器上;
  2. 将本地服务器的数据打包并传输到目标集群的服务器上;
  3. 将目标集群服务器上的元数据解压并使用copyFromLocal命令转储到目标集群上;

--------------------------------------------------------------------------------------------------------------------

综上,只需两个脚本即可搞定:

在源集群服务器上执行:export_hive_data.sh ;

#!/bin/bash
#如果非第一次执行执行,一定要先清空导出的目录,否则export出的数据不会覆盖之前的旧数据
hdfs dfs -rm -R /user/hive/tmp/*

hive -e "
export table ods.app_log to '/user/hive/tmp/ods.app_log';
export table ods.t_user to '/user/hive/tmp/ods.t_user';
export table dwd.app_event_log to '/user/hive/tmp/dwd.app_event_log';
export table dwd.app_page_log to '/user/hive/tmp/dwd.app_page_log';
export table dwd.app_start_log to '/user/hive/tmp/dwd.app_start_log';
export table dwd.app_video_log to '/user/hive/tmp/dwd.app_video_log';
export table dwd.user_his to '/user/hive/tmp/dwd.user_his';
export table dwd.user_his_tmp to '/user/hive/tmp/dwd.user_his_tmp';
export table dim.app_event_info to '/user/hive/tmp/dim.app_event_info';
export table dim.app_page_info to '/user/hive/tmp/dim.app_page_info';
export table dim.dim_date to '/user/hive/tmp/dim.dim_date';
export table dim.dim_time to '/user/hive/tmp/dim.dim_time';
"
hdfs dfs -copyToLocal /user/hive/tmp/ ./

tar -czvf hive-data.tar.gz ./tmp

scp hive-data.tar.gz hive@39.**.**.**:/home/hive/

在目标集群服务器上执行:import_hive_data.sh 

#!/bin/bash

tar -zxvf ./hive-data.tar.gz 
#hdfs dfs -rm -R /user/hive/tmp/*
# -f参数可以强制覆盖名字相同的文件
hdfs dfs -copyFromLocal -f ./tmp/* /user/hive/tmp/

hive -e "
drop table if exists ods.app_log;
drop table if exists ods.t_user;
drop table if exists dwd.app_event_log;
drop table if exists dwd.app_page_log;
drop table if exists dwd.app_start_log;
drop table if exists dwd.app_video_log;
drop table if exists dwd.user_his;
drop table if exists dwd.user_his_tmp;
drop table if exists dim.app_event_info;
drop table if exists dim.app_page_info;
drop table if exists dim.dim_date;
drop table if exists dim.dim_time;

import table ods.app_log from '/user/hive/tmp/ods.app_log';
import table ods.t_user from '/user/hive/tmp/ods.t_user';
import table dwd.app_event_log from '/user/hive/tmp/dwd.app_event_log';
import table dwd.app_page_log from '/user/hive/tmp/dwd.app_page_log';
import table dwd.app_start_log from '/user/hive/tmp/dwd.app_start_log';
import table dwd.app_video_log from '/user/hive/tmp/dwd.app_video_log';
import table dwd.user_his from '/user/hive/tmp/dwd.user_his';
import table dwd.user_his_tmp from '/user/hive/tmp/dwd.user_his_tmp';
import table dim.app_event_info from '/user/hive/tmp/dim.app_event_info';
import table dim.app_page_info from '/user/hive/tmp/dim.app_page_info';
import table dim.dim_date from '/user/hive/tmp/dim.dim_date';
import table dim.dim_time from '/user/hive/tmp/dim.dim_time';
"

到此,搞定!!

重点提示:

1、hive的export命令导出的数据不会覆盖旧数据,也就是说,比如第一次导出了9号、10号的数据,第二次导出了9号、10号、11号的数据,但是在执行完两个脚本后,会发现目标hive中还是只有9和10号的数据,这个地方快给我整崩溃了,后来发现hive的export命令导出的_meta数据一直是第一次的,不会覆盖旧数据,所以一定要清空导出的目录!!!

2、在源hdfs和目标hdfs上操作的用户一定要和在服务器本地操作的用户保持一致,而且都还需要有操作hive的权限!!

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用以下两种方法将表从一个Hive集群迁移数据到另一个集群: 1. 使用Hive的导入导出工具 Hive提供了一个命令行工具,称为“导入导出”(import/export),可以将表从一个集群导出到HDFS文件中,然后再从HDFS文件中导入到另一个集群中的表中。以下是迁移表的步骤: 在源集群中使用导出工具将表导出到HDFS文件中: ``` $ hive -e 'set hive.cli.print.header=false; set hive.exec.compress.output=false; set hive.exec.compress.intermediate=false; set mapred.max.split.size=256000000; set mapred.min.split.size.per.node=100000000; set mapred.min.split.size.per.rack=100000000; set mapred.job.queue.name=exportQueue; INSERT OVERWRITE DIRECTORY "/tmp/hive-export/tableName" SELECT * FROM tableName;' ``` 在目标集群中使用导入工具将表从HDFS文件中导入到新表中: ``` $ hive -e 'set hive.cli.print.header=false; set hive.exec.compress.output=false; set hive.exec.compress.intermediate=false; set mapred.max.split.size=256000000; set mapred.min.split.size.per.node=100000000; set mapred.min.split.size.per.rack=100000000; set mapred.job.queue.name=importQueue; CREATE TABLE tableName (col1 type1, col2 type2, ..., colN typeN) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; LOAD DATA INPATH "/tmp/hive-export/tableName" INTO TABLE tableName;' ``` 2. 使用DistCp工具 另一种方法是使用Hadoop的DistCp工具将表从一个集群复制到另一个集群。以下是迁移表的步骤: 在源集群中使用DistCp将表复制到HDFS文件中: ``` $ hadoop distcp hdfs://source-hadoop-cluster:8020/user/hive/warehouse/table_name hdfs://destination-hadoop-cluster:8020/user/hive/warehouse/ ``` 在目标集群中使用Hive命令创建新表并加载数据: ``` $ hive -e 'CREATE TABLE table_name (col1 type1, col2 type2, ..., colN typeN) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; LOAD DATA INPATH "/user/hive/warehouse/table_name" INTO TABLE table_name;' ``` 请注意,这两种方法都需要在目标集群中创建新表以存储导入的数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码道功成

过程不易,恳请支持一下!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值