工具-Hadoop distcp

  • fs shell拷贝和移动
  • distcp 原理
  • 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数量。

工具-Hadoop distcp_第1张图片

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文件状态属性如权限、副本、块大小等。

原创,转载请注明来自

  • 博客https://blog.csdn.net/wenzhou1219
  • 个人网站http://jimwen.net/

你可能感兴趣的:(#,Hadoop)