pond2539 发表于 2017-12-17 19:31:48

hadoop之 distcp(分布式拷贝)

基本使用方法
  distcp最常用在集群之间的拷贝:
  hadoop distcp hdfs://master1:8020/foo/bar hdfs://master2:8020/bar/foo
  这条命令会把master集群的/foo/bar目录下的所有文件或目录名展开并存储到一个临时文件中,这些文件内容的拷贝工作被分配给多个map任务, 然后每个TaskTracker分别执行从master1到master2的拷贝操作。注意distcp使用绝对路径进行操作。
  命令行中可以指定多个源目录:
  hadoop distcp hdfs://master1:8020/foo/a hdfs://master1:8020/foo/b hdfs://master2:8020/bar/foo
  或者使用-f选项,从文件里获得多个源:
  hadoop distcp -f hdfs://master1:8020/srclist hdfs://master2:8020/bar/foo
  其中srclist 的内容是
  hdfs://master1:8020/foo/a
  hdfs://master1:8020/foo/b
  当从多个源拷贝时,如果两个源冲突,distcp会停止拷贝并提示出错信息, 如果在目的位置发生冲突,会根据选项设置解决。 默认情况会跳过已经存在的目标文件(比如不用源文件做替换操作)。每次操作结束时 都会报告跳过的文件数目,但是如果某些拷贝操作失败了,但在之后的尝试成功了, 那么报告的信息可能不够精确。
  每个TaskTracker必须都能够与源端和目的端文件系统进行访问和交互。 对于HDFS来说,源和目的端要运行相同版本的协议或者使用向下兼容的协议。
  拷贝完成后,建议生成源端和目的端文件的列表,并交叉检查,来确认拷贝真正成功。 因为distcp使用Map/Reduce和文件系统API进行操作,所以这三者或它们之间有任何问题 都会影响拷贝操作。一些distcp命令的成功执行可以通过再次执行带-update参数的该命令来完成, 但用户在如此操作之前应该对该命令的语法很熟悉。
  值得注意的是,当另一个客户端同时在向源文件写入时,拷贝很有可能会失败。 尝试覆盖HDFS上正在被写入的文件的操作也会失败。 如果一个源文件在拷贝之前被移动或删除了,拷贝失败同时输出异常 FileNotFoundException
选项
选项索引
标识描述备注-pPreserve  r: replication number

  b: block>  u: user
  g: group
  p: permission
修改次数不会被保留。并且当指定 -update 时,更新的状态不会 被同步,除非文件大小不同(比如文件被重新创建)。-i忽略失败就像在 附录中提到的,这个选项会比默认情况提供关于拷贝的更精确的统计, 同时它还将保留失败拷贝操作的日志,这些日志信息可以用于调试。最后,如果一个map失败了,但并没完成所有分块任务的尝试,这不会导致整个作业的失败。-log <logdir>记录日志到 <logdir>DistCp为每个文件的每次尝试拷贝操作都记录日志,并把日志作为map的输出。 如果一个map失败了,当重新执行时这个日志不会被保留。-m <num_maps>同时拷贝的最大数目指定了拷贝数据时map的数目。请注意并不是map数越多吞吐量越大。-overwrite覆盖目标如果一个map失败并且没有使用-i选项,不仅仅那些拷贝失败的文件,这个分块任务中的所有文件都会被重新拷贝。 就像下面提到的,它会改变生成目标路径的语义,所以 用户要小心使用这个选项。-update如果源和目标的大小不一样则进行覆盖像之前提到的,这不是"同步"操作。 执行覆盖的唯一标准是源文件和目标文件大小是否相同;如果不同,则源文件替换目标文件。 像 下面提到的,它也改变生成目标路径的语义, 用户使用要小心。-f <urilist_uri>使用<urilist_uri> 作为源文件列表这等价于把所有文件名列在命令行中。 urilist_uri 列表应该是完整合法的URI。更新和覆盖
  这里给出一些 -update和 -overwrite的例子。 考虑一个从/foo/a 和 /foo/b 到 /bar/foo的拷贝,源路径包括:
  hdfs://master1:8020/foo/a
  hdfs://master1:8020/foo/a/aa
  hdfs://master1:8020/foo/a/ab
  hdfs://master1:8020/foo/b
  hdfs://master1:8020/foo/b/ba
  hdfs://master1:8020/foo/b/ab
  如果没设置-update或 -overwrite选项, 那么两个源都会映射到目标端的 /bar/foo/ab。 如果设置了这两个选项,每个源目录的内容都会和目标目录的 内容 做比较。distcp碰到这类冲突的情况会终止操作并退出。
  默认情况下,/bar/foo/a 和 /bar/foo/b 目录都会被创建,所以并不会有冲突。
  现在考虑一个使用-update合法的操作:
  distcp -update hdfs://master1:8020/foo/a \
  hdfs://master1:8020/foo/b \
  hdfs://master2:8020/bar
  其中源路径/大小:
  hdfs://master1:8020/foo/a
  hdfs://master1:8020/foo/a/aa 32
  hdfs://master1:8020/foo/a/ab 32
  hdfs://master1:8020/foo/b
  hdfs://master1:8020/foo/b/ba 64
  hdfs://master1:8020/foo/b/bb 32
  和目的路径/大小:
  hdfs://master2:8020/bar
  hdfs://master2:8020/bar/aa 32
  hdfs://master2:8020/bar/ba 32
  hdfs://master2:8020/bar/bb 64
  会产生:
  hdfs://master2:8020/bar
  hdfs://master2:8020/bar/aa 32
  hdfs://master2:8020/bar/ab 32
  hdfs://master2:8020/bar/ba 64
  hdfs://master2:8020/bar/bb 32
  只有master2的aa文件没有被覆盖。如果指定了 -overwrite选项,所有文件都会被覆盖。
页: [1]
查看完整版本: hadoop之 distcp(分布式拷贝)