工具-Hadoop distcp

fs shell拷贝和移动

通常我们使用hadoop提供的fs shell来完成hdfs文件管理。为了对比dictcp,先看下常用的-cp和-mv的使用。
现有目录/lib包含文件1.data 2.data

-cp如下操作

  • hadoop fs -cp /lib /lib2 拷贝生成相同结构的lib2
  • hadoop fs -cp /lib /lib3/ 报错,目标目录不存在,注意这里目标目录后加了/,表示将lib整个拷贝到lib3下,所以lib3必须先存在
  • hadoop fs -mkdir /lib3
  • hadoop fs -cp /lib/* /lib3/ lib下通配符匹配的文件全部拷贝到lib3,末尾/加不加一样的效果
  • hadoop fs -cp /lib /lib3/ lib整个目录拷贝到lib3下

-mv类似,只是原目录执行完后被删除

distcp 原理

fs shell操作都是单进程的,对于大量数据的拷贝效率太低,且不支持集群拷贝。distcp就是为了解决这两个问题的,它通过构造一系列并发的map任务来支持大量数据集群内/跨集群拷贝,拷贝过程中可以通过MR执行进度来看拷贝进度。

整个流程示意如下:

  • distcp驱动组件首先会解析传入的参数
  • 然后借助Copy-listing Generator来生成待拷贝文件列表,不指定-f时使用GlobbedCopyListing扫描所有通配的文件,使用-f时使用FileBasedCopyListing从文件中读取待拷贝路径然后使用GlobbedCopyListing扫描所有通配的文件。
  • 最后启动MR任务来完成拷贝,这个MR只有map任务,为了完成这一过程,重写了InputFormat组件负责读入和划分分片,CopyMapper负责map拷贝,CopyCommitter负责拷贝写入。
  • UniformSizeInputFormat保证每个map拷贝的byte数基本相同,DynamicInputFormat 动态调整,保证传输快的map拷贝更多的byte,可以通过-strategy {dynamic|uniformsize}指定。可以通过-m指定map数量。

discp原理示意图

distcp 操作方法

hadoop distcp dir1 dir2 可用来代替cp,但又有所不同,分为如下两种情况

  • dir2 不存在,则新建dir2,dir1下文件全部复制到dir2
  • dir2 存在,则目录dir1被复制到dir2下,形成dir2/dir1结构,这样的差异原因是为了避免直接覆盖原有目录文件。可以使用-overwrite,保持同样的目录结构同时覆盖原有文件。
  • 也可以使用-update,比如hadoop distcp dir1 dir2仅更新dir2下相对dir1下发生变化的文件。
  • 注意不使用-overwrite和-update时,同名的文件就算发生了变化,也不会替换。

常用跨集群备份操作如下:

hadoop distcp -update -delete hdfs://namenode1:port1/dir1 hdfs://namenode2:port2/dir2

这里-delete删除没在源路径出现的文件或文件夹,-p文件状态属性如权限、副本、块大小等。

原创,转载请注明来自

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值