Hadoop—distcp

    DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具。 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝。 由于使用了Map/Reduce方法,这个工具在语义和执行上都会有特殊的地方。

1. DistCp的用法

     因为distcp可用于群集内部,也可用于群集之间,这儿用群集内来演示下:


[hadoop@master ~]$ hadoop fs -ls -R /user/hadoop/
drwxr-xr-x   - hadoop supergroup          0 2016-01-30 20:23 /user/hadoop/har
drwxr-xr-x   - hadoop supergroup          0 2016-01-30 20:02 /user/hadoop/har/combine.har
-rw-r--r--   3 hadoop supergroup          0 2016-01-30 20:02 /user/hadoop/har/combine.har/_SUCCESS
-rw-r--r--   5 hadoop supergroup        378 2016-01-30 20:02 /user/hadoop/har/combine.har/_index
-rw-r--r--   5 hadoop supergroup         23 2016-01-30 20:02 /user/hadoop/har/combine.har/_masterindex
-rw-r--r--   3 hadoop supergroup          6 2016-01-30 20:02 /user/hadoop/har/combine.har/part-0
drwxr-xr-x   - hadoop supergroup          0 2016-01-30 19:58 /user/hadoop/test_archive
-rw-r--r--   3 hadoop supergroup          2 2016-01-30 19:58 /user/hadoop/test_archive/2016-1
-rw-r--r--   3 hadoop supergroup          2 2016-01-30 19:58 /user/hadoop/test_archive/2016-2
-rw-r--r--   3 hadoop supergroup          2 2016-01-30 19:58 /user/hadoop/test_archive/2016-3
drwxr-xr-x   - hadoop supergroup          0 2016-01-30 23:36 /user/hadoop/test_distcp

[hadoop@master ~]$ hadoop distcp hdfs://master:9000/user/hadoop/har hdfs://master:9000/user/hadoop/test_distcp

[hadoop@master ~]$ hadoop fs -ls -R /user/hadoop/test_distcp
drwxr-xr-x   - hadoop supergroup          0 2016-01-30 23:40 /user/hadoop/test_distcp/har
drwxr-xr-x   - hadoop supergroup          0 2016-01-30 23:40 /user/hadoop/test_distcp/har/combine.har
-rw-r--r--   3 hadoop supergroup          0 2016-01-30 23:40 /user/hadoop/test_distcp/har/combine.har/_SUCCESS
-rw-r--r--   3 hadoop supergroup        378 2016-01-30 23:40 /user/hadoop/test_distcp/har/combine.har/_index
-rw-r--r--   3 hadoop supergroup         23 2016-01-30 23:40 /user/hadoop/test_distcp/har/combine.har/_masterindex
-rw-r--r--   3 hadoop supergroup          6 2016-01-30 23:40 /user/hadoop/test_distcp/har/combine.har/part-0


    distcp常用参数:

标识 描述 备注
-p[rbugp] Preserve
  r: replication number
  b: block size
  u: user
  g: group
  p: permission
修改次数不会被保留。并且当指定 -update 时,更新的状态会 被同步,除非文件大小不同(比如文件被重新创建)。
-i 忽略失败 就像在 附录中提到的,这个选项会比默认情况提供关于拷贝的更精确的统计, 同时它还将保留失败拷贝操作的日志,这些日志信息可以用于调试。最后,如果一个map失败了,但并没完成所有分块任务的尝试,这不会导致整个作业的失败。
-log 记录日志到 DistCp为每个文件的每次尝试拷贝操作都记录日志,并把日志作为map的输出。 如果一个map失败了,当重新执行时这个日志不会被保留。
-m 同时拷贝的最大数目 指定了拷贝数据时map的数目。请注意并不是map数越多吞吐量越大。
-overwrite 覆盖目标 如果一个map失败并且没有使用-i选项,不仅仅那些拷贝失败的文件,这个分块任务中的所有文件都会被重新拷贝。 就像下面提到的,它会改变生成目标路径的语义,所以 用户要小心使用这个选项。
-update 如果源和目标的大小不一样则进行覆盖 像之前提到的,这不是"同步"操作。 执行覆盖的唯一标准是源文件和目标文件大小是否相同;如果不同,则源文件替换目标文件。 像 下面提到的,它也改变生成目标路径的语义, 用户使用要小心。
-f 使用 作为源文件列表 这等价于把所有文件名列在命令行中。 urilist_uri 列表应该是完整合法的URI。

2. Map任务数量的确定

    DistCp会尝试着均分需要拷贝的内容,这样每个map拷贝差不多相等大小的内容。但因为文件是最小的拷贝粒度,所以配置增加同时拷贝(如map)的数目不一定会增加实际同时拷贝的数目以及总吞吐量。

     使用-m参数可以指定map任务数量,如果没有使用-m参数,会如何分配map任务数量呢?total_bytes<=256MB,则分配1个Map任务;如果total_bytes>256MB,则

    map数量=[total_bytes / bytes.per.map](向上取整),其中bytes.per.map=256MB

    20 * num_task_trackers

    也就是说,如果总数据量小于等于256MB会启动一个Map任务,如果大于256MB会先计算m(m为total_bytes / bytes.per.map向上取整后的结果),然后计算n=m/num_datanodenum_datanode为datanode节点的数量)如果n<=20,则map任务数量为m个,否则map总任务数量为20*num_datanode(这时,每个datanode上的map数为20)。举个例子,假如数据总量为20G,m=20GB/256MB=80,如果num_datanode=8,n=m/8=10<20,所以启动80个map任务;如果num_datanode=2,n=m/2=40>20,所以启动2*20=40个map任务。

3. 不同HDFS版本之间使用distcp

    对于不同Hadoop版本间的拷贝,用户应该使用HftpFileSystem。 这是一个只读文件系统,所以DistCp必须运行在目标端集群上(更确切的说是在能够写入目标集群的NodeManager上)。源的格式为: hftp:/// (dfs.http.address默认为 :50070)。如:

hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar  


    参考:DistCp Version2 Guide

               DistCp

               浅析Hadoop中的DistCp和FastCopy

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