【发布时间】:2015-10-30 00:33:38
【问题描述】:
我有两个 HDFS 设置,想将一些表从 HDFS1 复制(而不是迁移或移动)到 HDFS2。如何将数据从一个 HDFS 复制到另一个 HDFS?是否可以通过 Sqoop 或其他命令行?
【问题讨论】:
我有两个 HDFS 设置,想将一些表从 HDFS1 复制(而不是迁移或移动)到 HDFS2。如何将数据从一个 HDFS 复制到另一个 HDFS?是否可以通过 Sqoop 或其他命令行?
【问题讨论】:
DistCp(分布式副本)是一种用于在集群之间复制数据的工具。它使用 MapReduce 来影响其分布、错误处理和恢复以及报告。它将文件和目录列表扩展为映射任务的输入,每个任务都将复制源列表中指定的文件的一个分区。
用法:$ hadoop distcp <src> <dst>
例如:$ hadoop distcp hdfs://nn1:8020/file1 hdfs://nn2:8020/file2
file1 从 nn1 复制到 nn2,文件名为 file2
Distcp 是目前最好的工具。 Sqoop 用于将数据从关系数据库复制到 HDFS,反之亦然,但不能在 HDFS 到 HDFS 之间复制。
更多信息:
有两个版本可用 - distcp2 的运行时性能比 distcp 更高
【讨论】:
distcp 用于在 hadoop 文件系统之间并行复制数据。它类似于通用的hadoop fs -cp 命令。在后台进程中,distcp 被实现为 MapReduce 作业,其中映射器仅用于跨集群并行复制。
用法:
将一个文件复制到另一个
% hadoop distcp file1 file2
将目录从一个位置复制到另一个位置
% hadoop distcp dir1 dir2
如果dir2 不存在,那么它将创建该文件夹并复制内容。如果dir2 已经存在,那么dir1 将被复制到它下面。 -overwrite 选项强制覆盖同一文件夹中的文件。 -update 选项仅更新已更改的文件。
在两个 HDFS 集群之间传输数据
% hadoop distcp -update -delete hdfs://nn1/dir1 hdfs://nn2/dir2
-delete 选项从目标中删除源中不存在的文件或目录。
【讨论】:
Hadoop 附带一个名为distcp 的有用程序,用于将大量数据并行复制到 Hadoop 文件系统和从 Hadoop 文件系统复制。 distcp 的规范用例是在两个 HDFS 集群之间传输数据。
如果集群运行相同版本的 hadoop,则适合使用 hdfs 方案。
$ hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar
namenode1 的/foo 目录中的数据将被复制到namenode2 的/bar 目录中。如果/bar 目录不存在,它将创建它。我们还可以提及多个源路径。
类似于rsync 命令,distcp 命令默认会跳过已经存在的文件。我们还可以使用-overwrite 选项覆盖目标目录中的现有文件。选项-update 只会更新已更改的文件。
$ hadoop distcp -update hdfs://namenode1/foo hdfs://namenode2/bar/foo
distcp 也可以实现为 MapReduce 作业,其中复制工作由跨集群并行运行的映射完成。不会有减速器。
如果尝试在运行不同版本的两个 HDFS 集群之间复制数据,复制过程将失败,因为 RPC 系统不兼容。在这种情况下,我们需要使用基于 HTTP 的只读 HFTP 文件系统从源中读取。在这里,作业必须在目标集群上运行。
$ hadoop distcp hftp://namenode1:50070/foo hdfs://namenode2/bar
50070 是 namenode 的嵌入式 Web 服务器的默认端口号。
【讨论】:
试试dtIngest,它是在Apache Apex平台之上开发的。该工具将数据从不同来源(如 HDFS、共享驱动器、NFS、FTP、Kafka)复制到不同的目的地。 dtIngest 支持将数据从远程 HDFS 集群复制到本地 HDFS 集群。 dtIngest 运行纱线作业以并行方式复制数据,因此速度非常快。它负责故障处理、恢复等,并支持定期轮询目录以进行连续复制。
用法:dtingest [OPTION]... SOURCEURL... DESTINATIONURL 例如:dtingest hdfs://nn1:8020/source hdfs://nn2:8020/dest
【讨论】:
还需要注意的是,您可以像这样使用源集群或目标集群运行底层 MapReduce 作业:
hadoop --config /path/to/hadoop/config distcp <src> <dst>
【讨论】:
distcp 命令用于从一个集群并行复制到另一个集群。你必须设置src的namenode的路径和dst的namenode的路径,内部它使用mapper。
例子:
$ hadoop distcp <src> <dst>
你可以为 distcp 设置几个选项
-m 表示没有。用于复制数据的映射器,这将提高复制速度。
-atomic 用于自动提交数据。
-update 只会更新旧版本的数据。
hadoop中复制文件的通用命令有-cp和-put,但只在数据量较小时使用。
【讨论】: