irpas技术客

hive数仓数据跨集群迁移_hive迁移数据到另一个集群_码道功成

未知 3619

当前集群是在局域网环境,按要求要迁到阿里云集群上(阿里云的服务器,自己搭建的大数据集群),所以要把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']

所以,总共分三步:

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

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

1、使用distcp

hadoop distcp? 源hdfs路径? 目标hdfs路径

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

2、传统scp命令传输

这里又可以分三步:

将源hdfs的数据使用copyToLocal命令转储到本地服务器上;将本地服务器的数据打包并传输到目标集群的服务器上;将目标集群服务器上的元数据解压并使用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.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #hive迁移数据到另一个集群 #1export命令EXPORT #TABLE #tableName #partition