分享

hadoop深入研究:(四)——distcp

本帖最后由 pig2 于 2014-3-28 18:03 编辑


我们前几篇文章讲的都是单线程的操作,如果要并行拷贝很多文件,hadoop提供了一个小工具distcp,最常见的用法就是在两个hadoop集群间拷贝文件,帮助文档很详尽,这里就不一一解释了,开发环境没有两个集群,用同一集群演示:
hadoop distcp hdfs://namenode:9000/user/hadoop/input hdfs://namenode:9000/user/hadoop/input1
完整的options列表:


  1. distcp [OPTIONS] <srcurl>* <desturl>
  2. OPTIONS:
  3. -p[rbugp]              Preserve status
  4.                        r: replication number
  5.                        b: block size
  6.                        u: user
  7.                        g: group
  8.                        p: permission
  9.                        -p alone is equivalent to -prbugp
  10. -i                     Ignore failures
  11. -log <logdir>          Write logs to <logdir>
  12. -m <num_maps>          Maximum number of simultaneous copies
  13. -overwrite             Overwrite destination
  14. -update                Overwrite if src size different from dst size
  15. -skipcrccheck          Do not use CRC check to determine if src is
  16.                        different from dest. Relevant only if -update
  17.                        is specified
  18. -f <urilist_uri>       Use list at <urilist_uri> as src list
  19. -filelimit <n>         Limit the total number of files to be <= n
  20. -sizelimit <n>         Limit the total size to be <= n bytes
  21. -delete                Delete the files existing in the dst but not in src
  22. -mapredSslConf <f>     Filename of SSL configuration for mapper task
复制代码






看下distcp的执行结果你会发现,distcp是个MapReduce任务,但只有map没有reducer。
  1. 13/06/18 10:59:19 INFO tools.DistCp: srcPaths=[hftp://namenode:50070/user/hadoop/input]
  2. 13/06/18 10:59:19 INFO tools.DistCp: destPath=hdfs://namenode:9000/user/hadoop/input1
  3. 13/06/18 10:59:20 INFO tools.DistCp: hdfs://namenode:9000/user/hadoop/input1 does not exist.
  4. 13/06/18 10:59:20 INFO tools.DistCp: sourcePathsCount=3
  5. 13/06/18 10:59:20 INFO tools.DistCp: filesToCopyCount=2
  6. 13/06/18 10:59:20 INFO tools.DistCp: bytesToCopyCount=1.7m
  7. 13/06/18 10:59:20 INFO mapred.JobClient: Running job: job_201306131134_0009
  8. 13/06/18 10:59:21 INFO mapred.JobClient:  map 0% reduce 0%
  9. 13/06/18 10:59:35 INFO mapred.JobClient:  map 100% reduce 0%
复制代码






distcp把一大堆文件平均分摊开交给map去执行,每个文件单独一个map任务。那么默认会分成几个map合适呢?首先按256mb平均分,如果总大小低于256mb,distcp只会分配一个map。但如果平分得结果出现节点得map数大于20的情况,每个节点的map数就会按20算,看下流程图:
20130617182809031.jpg


你可以通过-m手动设置,如果为了hdfs的均衡,最好是将maps设的多一些,将block分摊开来。

如果两个集群间的版本不一致,那么使用hdfs可能就会产生错误,因为rpc系统不兼容。那么这时候你可以使用基于http协议的hftp协议,但目标地址还必须是hdfs的,象这样:

hadoop distcp hftp://namenode:50070/user/hadoop/input hdfs://namenode:9000/user/hadoop/input1

推荐用hftp的替代协议webhdfs,源地址和目标地址都可以使用webhdfs,可以完全兼容


  1. hadoop distcp webhdfs://namenode:50070/user/hadoop/input webhdfs://namenode:50070/user/hadoop/input1
复制代码




感谢Tom White,此文章大部分来自于大神的definitive guide,奈何中文版翻译太烂,就在英文原版的基础上和官方的一些文档加入一些自己的理解。
全当是读书笔记吧,画蛇添足之举。
转载请注明出处:http://blog.csdn.net/lastsweetop/article/details/9086695



没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条