工具-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数量。
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文件状态属性如权限、副本、块大小等。
原创,转载请注明来自
标签:dir2,fs,hadoop,Hadoop,lib3,工具,拷贝,distcp 来源: https://blog.csdn.net/wenzhou1219/article/details/88920013