Hadoop DistCp 使用指南

原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/distcp.html

概述

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

使用方法

基本使用方法

DistCp最常用在集群之间的拷贝:

bash$ hadoop distcp hdfs://nn1:8020/foo/bar \

hdfs://nn2:8020/bar/foo

这条命令会把nn1集群的/foo/bar目录下的所有文件或目录名展开并存储到一个临时文件中,这些文件内容的拷贝工作被分配给多个map任务,
然后每个TaskTracker分别执行从nn1到nn2的拷贝操作。注意DistCp使用绝对路径进行操作。

命令行中可以指定多个源目录:

bash$ hadoop distcp hdfs://nn1:8020/foo/a

hdfs://nn1:8020/foo/b

hdfs://nn2:8020/bar/foo

或者使用-f选项,从文件里获得多个源:

bash$ hadoop distcp -f hdfs://nn1:8020/srclist

hdfs://nn2:8020/bar/foo

其中srclist 的内容是

hdfs://nn1:8020/foo/a

hdfs://nn1:8020/foo/b

当从多个源拷贝时,如果两个源冲突,DistCp会停止拷贝并提示出错信息,
如果在目的位置发生冲突,会根据选项设置解决。
默认情况会跳过已经存在的目标文件(比如不用源文件做替换操作)。每次操作结束时
都会报告跳过的文件数目,但是如果某些拷贝操作失败了,但在之后的尝试成功了,
那么报告的信息可能不够精确(请参考附录)。

每个TaskTracker必须都能够与源端和目的端文件系统进行访问和交互。
对于HDFS来说,源和目的端要运行相同版本的协议或者使用向下兼容的协议。
(请参考不同版本间的拷贝 )。

拷贝完成后,建议生成源端和目的端文件的列表,并交叉检查,来确认拷贝真正成功。
因为DistCp使用Map/Reduce和文件系统API进行操作,所以这三者或它们之间有任何问题
都会影响拷贝操作。一些Distcp命令的成功执行可以通过再次执行带-update参数的该命令来完成,
但用户在如此操作之前应该对该命令的语法很熟悉。

值得注意的是,当另一个客户端同时在向源文件写入时,拷贝很有可能会失败。
尝试覆盖HDFS上正在被写入的文件的操作也会失败。
如果一个源文件在拷贝之前被移动或删除了,拷贝失败同时输出异常
FileNotFoundException。

选项

选项索引

标识 描述 备注
-p[rbugp] Preserve
  r: replication number
  b: block size
  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://nn1:8020/foo/a

hdfs://nn1:8020/foo/a/aa

hdfs://nn1:8020/foo/a/ab

hdfs://nn1:8020/foo/b

hdfs://nn1:8020/foo/b/ba

hdfs://nn1:8020/foo/b/ab

如果没设置-update或 -overwrite选项,
那么两个源都会映射到目标端的
/bar/foo/ab。
如果设置了这两个选项,每个源目录的内容都会和目标目录的
内容 做比较。DistCp碰到这类冲突的情况会终止操作并退出。

默认情况下,/bar/foo/a 和
/bar/foo/b 目录都会被创建,所以并不会有冲突。

现在考虑一个使用-update合法的操作:

distcp -update hdfs://nn1:8020/foo/a

hdfs://nn1:8020/foo/b

hdfs://nn2:8020/bar

其中源路径/大小:

hdfs://nn1:8020/foo/a

hdfs://nn1:8020/foo/a/aa 32

hdfs://nn1:8020/foo/a/ab 32

hdfs://nn1:8020/foo/b

hdfs://nn1:8020/foo/b/ba 64

hdfs://nn1:8020/foo/b/bb 32

和目的路径/大小:

hdfs://nn2:8020/bar

hdfs://nn2:8020/bar/aa 32

hdfs://nn2:8020/bar/ba 32

hdfs://nn2:8020/bar/bb 64

会产生:

hdfs://nn2:8020/bar

hdfs://nn2:8020/bar/aa 32

hdfs://nn2:8020/bar/ab 32

hdfs://nn2:8020/bar/ba 64

hdfs://nn2:8020/bar/bb 32

只有nn2的aa文件没有被覆盖。如果指定了
-overwrite选项,所有文件都会被覆盖。

附录

Map数目

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

如果没使用-m选项,DistCp会尝试在调度工作时指定map的数目
为 min (total_bytes / bytes.per.map, 20 * num_task_trackers),
其中bytes.per.map默认是256MB。

建议对于长时间运行或定期运行的作业,根据源和目标集群大小、拷贝数量大小以及带宽调整map的数目。

不同HDFS版本间的拷贝

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

Map/Reduce和副效应

像前面提到的,map拷贝输入文件失败时,会带来一些副效应。

  • 除非使用了-i,任务产生的日志会被新的尝试替换掉。
  • 除非使用了-overwrite,文件被之前的map成功拷贝后当又一次执行拷贝时会被标记为
    "被忽略"。
  • 如果map失败了mapred.map.max.attempts次,剩下的map任务会被终止(除非使用了-i)。
  • 如果mapred.speculative.execution被设置为
    final和true,则拷贝的结果是未定义的。

原文地址:https://www.cnblogs.com/boonya/p/8858977.html

时间: 2024-08-29 19:28:45

Hadoop DistCp 使用指南的相关文章

hadoop distcp使用

概述 distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具. 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成. 它把文件和目录的列表作为map任务的输入,每个任务会完成源列表中部分文件的拷贝. 由于使用了Map/Reduce方法,这个工具在语义和执行上都会有特殊的地方. 这篇文档会为常用distcp操作提供指南并阐述它的工作模型. 基本使用方法 distcp最常用在集群之间的拷贝: hadoop distcp hdfs://master1:8020/foo/b

mvn+eclipse构建hadoop项目并运行(超简单hadoop开发入门指南)

本文详述如何在windows开发环境下通过mvn+eclipse构建hadoop项目并运行 必备环境 windows7操作系统 eclipse-4.4.2 mvn-3.0.3及用mvn生成项目架构(参阅http://blog.csdn.net/tang9140/article/details/39157439) hadoop-2.5.2(直接上hadoop官网http://hadoop.apache.org/下载hadoop-2.5.2.tar.gz并解压到某个目录) windows7下环境配置

Hadoop权威指南读书笔记

本书中提到的Hadoop项目简述 Common:一组分布式文件系统和通用I/O的组件与接口(序列化.javaRPC和持久化数据结构). Avro:一种支持高效.跨语言的RPC以及永久存储数据的序列化系统. MapReduce:分布式数据处理模型和执行环境,运行于大型商业集群. HDFS:分布式文件系统,运行于大型商用机集群. Pig:一种数据流语言和运行环境,用以检索非常大的数据集.Pig运行在MapReduce和HDFS的集群上. Hive:一个分布式.按列存储的数据仓库.Hive管理HDFS

[Hadoop]数据复制DistCp

1.需求 我们项目中需要复制一个大文件,最开始使用的是hadoop cp命令,但是随着文件越来越大,拷贝的时间也水涨船高.下面进行hadoop cp与hadoop distcp拷贝时间上的一个对比.我们将11.9G的文件从data_group/adv/day=20170116下所有文件复制到tmp/data_group/adv/day=20170116/文件下 1.1 查看文件大小 hadoop fs -du -s -h data_group/adv/day=20170116 11.9 G da

Hadoop的distcp命令出现Permission denied错误

Hadoop的distcp命令可以实现将文件从一个hdfs文件系统中拷贝到另外一个文件系统中,如下所示: $ bin/hadoop distcp -overwrite hdfs://123.123.23.111:9000/hsd/t_url hdfs://123.123.23.156:9000/data/t_url 正常情况下应该出现如下运行结果: Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared m

深入理解HDFS:Hadoop分布式文件系统

文本详细介绍了HDFS中的许多概念,对于理解Hadoop分布式文件系统很有帮助. 1. 介绍 在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储.统一管理分布在集群上的文件系统称为分布式文件系统.而一旦在系统中,引入网络,就不可避免地引入了所有网络编程的复杂性,例如挑战之一是如果保证在节点不可用的时候数据不丢失. 传统的网络文件系统(NFS)虽然也称为分布式文件系统,但是其存在一些限制.由于NFS中,文件是存储在单机上,因此无法提供可靠性保证,当很多客户端同时访问NFS Serve

Hadoop之MapReduce命令

概述 全部的Hadoop命令都通过bin/mapred脚本调用. 在没有不论什么參数的情况下.执行mapred脚本将打印该命令描写叙述. 使用:mapred [--config confdir] COMMAND [[email protected] bin]$ mapred Usage: mapred [--config confdir] COMMAND where COMMAND is one of: pipes run a Pipes job job manipulate MapReduce

青云指南

Spark 指南 Spark 是继 Hadoop 之后新一代的大数据分布式处理平台.它是一个基于内存.容错型的分布式计算引擎,与 Hadoop MapReduce 相比,计算速度要快100倍. Spark 卓越的用户体验以及统一的技术堆栈基本上解决了大数据领域所有的核心问题,使得 Spark 迅速成为当前最为热门的大数据基础平台. Spark 提供了多语言支持包括 Scala, Python, Java, R 等,特别适合迭代计算和交互式操作.它在 RDD(Resilient Distribut

Apache Hadoop 2.4.1 命令参考

概述 所有的Hadoop命令都是通过bin/hadoop目录下的脚本所执行,在没有任何参数的情况下运行Hadoop脚本将打印该命令描述. Usage:Hadoop  [--config confdir] [COMMAND] [GENERIC_OPTIONS] [COMMAND_OPTIONS] hadoop有个输入选项解析框架可以利用在运行class的时候来解析参数.  COMMAND_OPTION  Description  --config confdir  包含所有的配置目录,默认目录是$