两个hdfs之间迁移传输数据

本文参考其他大数据大牛的博文做了整理和实际验证,主要解决hdfs跨集群复制/迁移问题。

在hdfs数据迁移时总会涉及到两个hdfs版本版本问题,致力解决hdfs版本相同和不同两种情况的处理方式,长话短说,进正文。

distcp: hadoop自带的分布式复制程序

​ distcp 是hadoop自带的分布式复制程序,该程序可以从 Hadoop 文件系统间复制大量数据,也可以将大量的数据复制到 Hadoop 中。

​ distcp 的典型应用场景是在两个 HDFS 集群之间传输数据。

情况1:Hdfs版本相同(如果两个集群运行相同版本的 Hadoop,就非常适合使用 hdfs 方案):

shell 复制代码
hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar

#这行指令把第一个集群 /foo 目录(及其内容)复制到第二个集群的 /bar 目录下,所以第二个集群最后的目录结构是 /bar/foo。如果 /bar 不存在,则新建一个。也可以指定多个源路径,并把所有路径都复制到目标路径下。
#注意,源路径必须是绝对路径。

情况2:Hdfs版本不同(使用基于只读 HTTP 协议的 HFTP 文件系统并从源文件系统中读取数据):

如果试图在两个运行着不同 HDFS 版本的集群上使用 distcp 复制数据并使用 hdfs 协议,会导致复制作业失败,因为两个系统版本的 RPC 是不兼容的。

想要弥补这种情况,可以使用基于只读 HTTP 协议的 HFTP 文件系统并从源文件系统中读取数据。

这个作业必须运行在目标集群上,进而实现 HDFS RPC 版本的兼容。

shell 复制代码
hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar

#注意,需要在 URI 源中指定 namenode 的 Web 端口。这是由 dfs.http.address 属性决定的,其默认值为50070
#这个作业必须运行在目标集群上,进而实现 HDFS RPC 版本的兼容。

情况3:不考虑hdfs版本

使用 webhdfs 协议(替代hftp)后,对源集群和目标集群均可以使用HTTP协议进行通信,且不会造成任何不兼容的问题

hadoop distcp webhdfs://namenodel: 50070/foo webhdfs://namenode2:50070/bar

另外一个变种是使用 HDFS HTTP 代理服务作为源 distcp 或者目标 distcp,进而具备了设置防火墙和控制带宽的优点。

distcp 的选项
在默认情况下, distcp 会跳过目标路径下已经存在的文件,但可以通过 -overwrite 选项覆盖现有的文件。也可以通过 -update 选项来选择有改动的文件。
使用 -overwrite 和 -update 选项中任意一个(或两个)需要改变源路径和目标路径的解释方式

如果改变先前例子中第一个集群 /foo 目录下的一个文件,就会进行下面的命令将修改同步到第二个集群上:
	hadoop distcp -update hdfs://namenodel/foo hdfs://namenode2/bar/foo 
	
因为源目录下的内容已被复制到目标目录下,所以需要在目标路径中添加额外的子目录 /foo。
(如果对 rsync 命令比较熟悉,可以认为 -overwrite 或 -update 选项就是在源路径末尾添加一个斜杠。)

有很多选项可以用来控制 distcp 的复制方式,包括保留文件属性,忽略节点故障和限制文件或总数据的复制量。

不带任何选项运行时,将显示使用说明。
distcp 的底层原理

​ distcp 是作为一个 MapReduce 作业来实现的,该复制作业是通过集群中并行运行的 map 来完成。这里没有 Reducer。

每个文件通过一个 map 进行复制,并且 distcp 试图为毎一个 map 分配大致相等的数据来执行,即把文件划分为大致相等的块。

map 的数量是这样确定的。

让每一个 map 复制合理的数据量来尽量减少构建任务时所涉及的开销,这是一个很好的想法,所以每个 map 至少复制256MB数据(除非输入的总数据量较少,否则一个 map 就可以完成所有的复制)。

例如,将 1GB 大小的文件分给4个map任务。

如果数据非常大则有必要限制 map 的数量进而限制带宽和集群的使用。

默认情况下,每个集群节点最多分配20个map任务。

例如,将 1000GB 的文件复制到一个由 100 个节点组成的集群,一共分配 2000 个 map 任务(每个节点 20 个 map 任务),所以每个map任务平均复制 512MB 数据。

通过对 distcp 指定 -m 参数,可以减少分配的map任务数。

例如,-m 1000 将分配 1000 个 map 任务,每个平均复制 1GB 数据

学习参考:https://blog.csdn.net/Shockang/article/details/117729852

相关推荐
Elastic 中国社区官方博客32 分钟前
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器
大数据·elasticsearch·搜索引擎·云计算·全文检索·可用性测试·aws
Aloudata2 小时前
从Apache Atlas到Aloudata BIG,数据血缘解析有何改变?
大数据·apache·数据血缘·主动元数据·数据链路
水豚AI课代表2 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc
拓端研究室TRL5 小时前
【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...
大数据
黄焖鸡能干四碗5 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
编码小袁5 小时前
探索数据科学与大数据技术专业本科生的广阔就业前景
大数据
WeeJot嵌入式6 小时前
大数据治理:确保数据的可持续性和价值
大数据
zmd-zk6 小时前
kafka+zookeeper的搭建
大数据·分布式·zookeeper·中间件·kafka
激流丶7 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
测试界的酸菜鱼7 小时前
Python 大数据展示屏实例
大数据·开发语言·python