大数据技术之集群数据迁移

news/2024/4/20 2:17:49/文章来源:https://blog.csdn.net/weixin_37791303/article/details/129907613

在大数据集群数据迁移的项目中涉及到很多技术细节,本博客记录了迁移的大致的操作步骤。
迁移借用Hadoop自带的插件:distcp。

一、Hadoop集群数据迁移

**DistCp(分布式拷贝)**是用于大规模集群内部和集群之间拷贝的工具。它使用Map/Reduce实现文件分发(DistCp原理是在Hadoop集群中使用MapReduce分布式拷贝数据),错误处理和恢复,以及报告生成。它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。

1. 迁移之前需要考虑的问题

- 迁移总数据量有多少?

- 新老集群之间的带宽有多少?能否全部用完?为了减少对线上其他业务的影响最多可使用多少带宽?

- 如何限制迁移过程中使用的带宽?

- 迁移过程中,哪些文件可能发生删除,新增数据的情况?新数据和旧数据怎么处理?哪些目录可能会发生新增文件的情况?

- 迁移后的数据一致性校验怎么做?

- 迁移后的HDFS文件权限如何跟老集群保持一致?

2. 迁移方案

1、迁移数据量评估

通过hdfs dfs -du -h / 命令查看各目录总数据量。按业务划分,统计各业务数据总量。

2、制定迁移节奏

由于数据量大,带宽有限,HDFS中的文件每天随业务不断变化,所以在文件变化之前全部迁移完成是不现实的。建议按业务、分目录、分批迁移。

3、迁移工具选择

使用Hadoop自带数据迁移工具Distcp,只需要简单的命令即可完成数据迁移。
命令示意:

hadoop distcp hdfs://nn1:8020/data hdfs://nn2:8020/

4、迁移时间评估

由于老集群每天仍然在使用,为了减小对线上业务的影响,尽量选择老集群低负载运行的时间段来进行数据迁移

5、对新老集群之间的网络进行硬件改造

咨询运维同学,新老集群之间的最大传输带宽是多少,如果带宽跑满的话会不会影响线上其他业务。能否对新老集群之间的网络进行硬件改造,例如通过新老集群之间搭网线的方式来提升网络传输的带宽并消除对其他线上业务的影响。

6、数据迁移状况评估

在完成上面所有准备之后,先尝试进行小数据量的迁移,可以先进行100G的数据迁移、500G的数据迁移、1T的数据迁移,以评估数据迁移速率并收集迁移过程中遇到的问题。

3. 迁移工具Distcp

工具使用很简单,只需要执行简单的命令即可开始数据迁移,可选参数如下:
hadoop distcp 源HDFS文件路径 目标HDFS文件路径
同版本集群拷贝(或者协议兼容版本之间的拷贝)使用HDFS协议

hadoop distcp hdfs://src-name-node:3333/user/src/dir hdfs://dst-namenode:4444/user/dst/dir

不同版本集群拷贝(比如1.x到2.x)使用hxp协议或者webhdfs协议,都是使用hdfs的HTTP端口

hadoop distcp hftp://src-name-node:80/user/src/dir hftp://dst-namenode:80/user/dst/dir
hadoop distcp webhdfs://src-name-node:80/user/src/dir webhdfs://dst-namenode:80/user/dst/dir

1、Distcp的原理

Distcp的本质是一个MapReduce任务,只有Map阶段,没有Reduce阶段,具备分布式执行的特性。在Map任务中从老集群读取数据,然后写入新集群,以此来完成数据迁移。

2、迁移期间新老两个集群的资源消耗是怎样的?

Distcp是一个MapReduce任务,如果在新集群上执行就向新集群的Yarn申请资源,老集群只有数据读取和网络传输的消耗。

3、如何提高数据迁移速度?

Distcp提供了 -m 参数来设置map任务的最大数量(默认20),以提高并发性。注意这里要结合最大网络传输速率来设置。

4、带宽如何限制?

Distcp提供了 -bandwidth 参数来控制单个Map任务的最大带宽,单位是MB。

5、迁移之后的数据一致性怎么校验?

Distcp负责进行CRC校验,可以通过-skipcrccheck参数来跳过校验来提供性能。

6、迁移之后的文件权限是怎样的?

Distcp提供了 -p 参数来在新集群里保留状态(rbugpcaxt)(复制,块大小,用户,组,权限,校验和类型,ACL,XATTR,时间戳)。如果没有指定 -p 参数,权限是执行MapReduce任务的用户权限,迁移完成以后需要手动执行chown命令变更。

7、迁移的过程中老集群目录新增了文件,删除了文件怎么办?

把握好迁移节奏,尽量避免这些情况的出现。Distcp在任务启动的时候就会将需要copy的文件列表从源HDFS读取出来。如果迁移期间新增了文件,新增的文件会被漏掉。删除文件会导致改文件copy失败,可以通过 -i参数忽略失败。

8、迁移中遇到文件已存在的情况怎么办?

Distcp提供了-overwrite 参数来覆盖已存在的文件。

9、迁移了一半,任务失败了怎么办?

删除掉新集群中的脏数据,重新执行迁移命令。不加-overwrite参数,来跳过已存在的文件。

10、遇到需要对一个文件增量同步怎么办?

Distcp提供-append参数将源HDFS文件的数据新增进去而不是覆盖它。

二、迁移步骤演示

1)准备两套集群,我这使用apache集群和CDH集群。

在这里插入图片描述

2)启动集群

在这里插入图片描述
在这里插入图片描述

3)启动完毕后,将apache集群中,hive库里dwd,dws,ads三个库的数据迁移到CDH集群

在这里插入图片描述
在这里插入图片描述

4)在apache集群里hosts加上CDH Namenode对应域名并分发给各机器

[root@hadoop101 ~]# vim /etc/hosts
在这里插入图片描述

[root@hadoop101 ~]# scp /etc/hosts hadoop102:/etc/                                                                                              [root@hadoop101 ~]# scp /etc/hosts hadoop103:/etc/

5)因为集群都是HA模式,所以需要在apache集群上配置CDH集群,让distcp能识别出CDH的nameservice

[root@hadoop101 hadoop]# vim /opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml <!--配置nameservice-->
<property><name>dfs.nameservices</name><value>mycluster,nameservice1</value>
</property><!--指定本地服务-->
<property><name>dfs.internal.nameservices</name><value>mycluster</value>
</property><!--配置多NamenNode-->
<property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2,nn3</value>
</property><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop101:8020</value>
</property><property><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop102:8020</value>
</property><property><name>dfs.namenode.rpc-address.mycluster.nn3</name><value>hadoop103:8020</value>
</property><!--配置nameservice1的namenode服务--><property><name>dfs.ha.namenodes.nameservice1</name><value>namenode30,namenode37</value></property><property><name>dfs.namenode.rpc-address.nameservice1.namenode30</name><value>hadoop104:8020</value></property>
<property><name>dfs.namenode.rpc-address.nameservice1.namenode37</name><value>hadoop106:8020</value></property><property><name>dfs.namenode.http-address.nameservice1.namenode30</name><value>hadoop104:9870</value></property><property><name>dfs.namenode.http-address.nameservice1.namenode37</name><value>hadoop106:9870</value></property><property><name>dfs.client.failover.proxy.provider.nameservice1</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!--为NamneNode设置HTTP服务监听--><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop101:9870</value>
</property><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop102:9870</value>
</property><property><name>dfs.namenode.http-address.mycluster.nn3</name><value>hadoop103:9870</value>
</property><!--配置HDFS客户端联系Active NameNode节点的Java类--><property><name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

6)修改CDH hosts

[root@hadoop101 ~]# vim /etc/hosts

7)进行分发,这里的hadoop104,hadoop105,hadoop106分别对应apache的hadoop101,hadoop102,hadoop103

[root@hadoop101 ~]# scp /etc/hosts hadoop102:/etc/
[root@hadoop101 ~]# scp /etc/hosts hadoop103:/etc/

8)同样修改CDH集群配置,在所有hdfs-site.xml文件里修改配置

<property><name>dfs.nameservices</name><value>mycluster,nameservice1</value>
</property><property><name>dfs.internal.nameservices</name><value>nameservice1</value>
</property><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2,nn3</value>
</property><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop104:8020</value>
</property><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop105:8020</value>
</property><property><name>dfs.namenode.rpc-address.mycluster.nn3</name><value>hadoop106:8020</value>
</property><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop104:9870</value>
</property><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop105:9870</value>
</property><property><name>dfs.namenode.http-address.mycluster.nn3</name><value>hadoop106:9870</value>
</property><property><name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property>

9)最后注意:重点由于Apahce集群和CDH集群3台集群都是hadoop101,hadoop102,hadoop103所以要关闭域名访问,使用IP访问

CDH把钩去了

10)apache设置为false

11)再使用hadoop distcp命令进行迁移,-Dmapred.job.queue.name指定队列,默认是default队列。上面配置集群都配了的话,那么在CDH和apache集群下都可以执行这个命令

[root@hadoop101 hadoop]# hadoop distcp -Dmapred.job.queue.name=hive  webhdfs://mycluster:9070/user/hive/warehouse/dwd.db/  hdfs://nameservice1/user/hive/warehouse

12)会启动一个MR任务,正在迁移

13)查看cdh 9870 http地址

14)数据已经成功迁移。数据迁移成功之后,接下来迁移hive表结构,编写shell脚本

[root@hadoop101 module]# vim exportHive.sh #!/bin/bashhive -e "use dwd;show tables">tables.txtcat tables.txt |while read eachlinedohive -e "use dwd;show create table $eachline">>tablesDDL.txtecho ";" >> tablesDDL.txtdone

15)执行脚本后将tablesDDL.txt文件分发到CDH集群下

[root@hadoop101 module]# scp tablesDDL.txt  hadoop104:/opt/module/

16)然后CDH下导入此表结构,先进到CDH的hive里创建dwd库

[root@hadoop101 module]# hive
hive> create database dwd;

17)创建数据库后,边界tablesDDL.txt在最上方加上use dwd;

18)并且将createtab_stmt都替换成空格

[root@hadoop101 module]# sed -i s"#createtab_stmt# #g" tablesDDL.txt

19)最后执行hive -f命令将表结构导入

[root@hadoop101 module]# hive -f tablesDDL.txt 

20)最后将表的分区重新刷新下,只有刷新分区才能把数据读出来,编写脚本

[root@hadoop101 module]# vim msckPartition.sh
#!/bin/bashhive -e "use dwd;show tables">tables.txtcat tables.txt |while read eachlinedohive -e "use dwd;MSCK REPAIR TABLE $eachline"done[root@hadoop101 module]# chmod +777 msckPartition.sh [root@hadoop101 module]# ./msckPartition.sh 

21)刷完分区后,查询表数据

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102329.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DHCP笔记

目录 DHCP动态主机配置协议——UDP67/68端口 DHCP获取IP地址 客户端首次获取IP地址 客户端再次获取IP地址 租期/续租 DHCP的工作报文 DHCP的配置 案例 DHCP动态主机配置协议——UDP67/68端口 DHCP是应用层协议&#xff0c;采用C/S服务模式&#xff0c;只能在一个广播域…

数据科学与机器学习在软件开发中的应用

数据科学和机器学习是现代软件开发的重要组成部分&#xff0c;可以帮助开发人员更好地理解和分析数据&#xff0c;从而提高软件的质量和性能。在本篇博客中&#xff0c;我将深入探讨数据科学和机器学习在软件开发中的应用&#xff0c;并讨论它们如何帮助我们创建更好的软件。 …

Xshell中的基本命令

whoami 当我们刚登录上Xshell的时候&#xff0c;我们应该做什么呢&#xff1f;&#xff1f; 我们上次说了如何增加使用者&#xff0c;和删除使用者&#xff0c;今天我们说一下其他的基本命令。 我们刚开始登录的时候可以用root登录 那么我们怎么看自己事谁呢&#xff1f; …

Android 一个获取网址时间的Demo

Android 一个获取网址时间的Demo 文章目录 Android 一个获取网址时间的Demo通过一个网址获取时间的代码关于Android NTP 时间Android 同步时间代码 前段时间有个客户想用局域网同步Android 设备的时间&#xff0c;开发后把这个demo分享一下。 效果&#xff1a; 这里也获取了阿…

VUE3子组件-业务代码优化

Vue3子组件 1.简介 Vue 3组件的主要优势之一就是它们可以帮助你将你的应用程序分解成可维护和可重用的部分。当你在应用程序中多次使用相同的代码时&#xff0c;你可以将它们抽象成一个组件&#xff0c;然后在应用程序中的多个地方使用该组件&#xff0c;而不必每次都编写相同…

User Diverse Preference Modeling by Multimodal Attentive Metric Learning

BACKGROUND 现有模型通常采用一个固定向量去表示用户偏好&#xff0c;在假设——特征向量每一个维度都代表了用户的一种特性或者一个方面&#xff0c;这种方式似乎不妥&#xff0c;因为用户对于不同物品的偏好是不一样的&#xff0c;例如因演员喜欢一部电影&#xff0c;而因特…

Linux 静态库的制作与使用

目录 静态库1、 什么是库2、 静态库的制作2.1 命名规则与制作规则 3、 静态库的使用 静态库 1、 什么是库 库文件是计算机上的一类文件&#xff0c;可以简单的把库文件看成一种代码仓库&#xff0c;它提供使用者可以直接拿来用的变量、函数或类。库是一种特殊的程序&#xff…

多兴趣推荐召回模型:ComiRec

前言 多兴趣向量召回系列&#xff1a; 通过Youtube DNN推荐模型来理解推荐流程 多兴趣召回模型&#xff1a;MIND 推荐系统可以表达为序列推荐问题的形式&#xff0c;序列推荐任务是通过用户的历史行为来预测用户下一个感兴趣的item&#xff0c;这也与真实场景的推荐场景是符…

ERROR org.springframework.web.context.ContextLoader

项目启动时报错&#xff1a; ERROR org.springframework.web.context.ContextLoader - Context initialization failed java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationUtils.clearCache() 原因分析 这个错误的原因可能是因为 Spring 的不同…

Go 语言进阶与依赖管理

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客主页&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 一、语言进阶1. 并发和并行2. 协程(Goroutine…

Ubuntu20.04软件安装大全

目录 Ubuntu20.04 软件安装大全前言1. Windows和Ubuntu双系统安装1.1 下载Ubuntu系统镜像1.2 磁盘分区1.3 GPT分区安装Ubuntu1.4 系统完成后的一些设置1.5 遇到的一些小bug 2. 换源2.1 apt换源2.2 pip换源 3. 显卡驱动安装3.1 卸载显卡驱动3.2 准备工作3.3 驱动安装3.4 验证 4.…

Python自动发送消息小脚本,可用于各种聊天框~

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect 个…

2023-04-23 算法面试中常见的动态规划问题

动态规划 1 什么是动态规划 以菲波那切数列求和为例&#xff0c;通过 1.普通的递归2.引入记忆数组memo3.自下而上地解决问题&#xff0c;即动态规划 动态规划的定义 dynamic programming (also known as dynamic optimization) is a method for solving a complex problem by…

C嘎嘎~~ 【初识C++ 下篇】

初识C 下篇 1.引用1.1引用的概念1.2引用的特点1.3常引用1.4引用使用的场景1.5引用和指针的区别 2.指针空值 --- nullptr3.内联函数3.1 内联函数的概念3.2内联函数的使用场景3.3内联函数的特性 1.引用 1.1引用的概念 相信大家小时候&#xff0c; 肯定有小名、绰号、亲朋好友的昵…

Zuul源码解析(二)

Zuul 的自动配置 ZuulProxyAutoConfiguration 如何触发 如上图&#xff0c;在 spring.factory 中配置 ZuulProxyAutoConfiguration 自动配置了&#xff0c;直接点进去 如上图所示&#xff0c;发现这有个条件注解&#xff0c;需要有 org.springframework.cloud.netflix.zuul.Zu…

“支付+SaaS”赋能传统产业数字化转型

易观&#xff1a;传统支付业务利润空间在政策监管和市场竞争下不断被压缩&#xff0c;多家上市支付机构逐步将业务经营重点转移切入到企业交易环节&#xff0c;为企业提供包括SaaS服务、行业解决方案、营销服务及金融科技服务等在内的企业服务收入成为新的增长点。 伴随着“十四…

Linux网络服务之yum仓库

目录 一、yum仓库简介二. ftp搭建yum源三. 搭建国内在线源四. 本地源和在线yum同时使用五. 通过缓存的方式保存所下载的软件包六 . 制作yum仓库 一、yum仓库简介 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机…

Java入门教程||Java 继承||Java 重写(Override)与重载(Overload)

Java 继承 继承是所有 OOP 语言和 Java 语言不可缺少的组成部分。 继承是 Java 面向对象编程技术的一块基石&#xff0c;是面向对象的三大特征之一&#xff0c;也是实现软件复用的重要手段&#xff0c;继承可以理解为一个对象从另一个对象获取属性的过程。 如果类 A 是类 B …

Automa自动化爬取文本(一)

目录 介绍 下载地址 安装教程 爬取百度热搜 介绍 Automa 是一个免费、开源的 Chrome 扩展&#xff0c;它通过目前流行的 No Code 无代码方式&#xff0c;只需要拖拽模块就实现了浏览器自动化&#xff0c;比如自动填写表格、执行重复性任务。 在工作中&#xff0c;如果我们…

learn_C_deep_5 (语句和表达式的概念、if语句的多种语法结构、C语言有没有布尔类型、“零值”的比较)

目录 语句和表达式的概念 if语句的多种语法结构 注释的便捷方法&#xff08;环境vs&#xff09; if语句执行的过程 逻辑与&& 逻辑或|| 运算关系的顺序 ​编辑 C语言有没有布尔类型 C99标准 sizeof(bool)的值为多少&#xff1f; _Bool原码 BOOL、TRUE、…