如何将数据从一个HDFS复制到另一个HDFS?

时间:2015-08-06 18:11:15

标签: hadoop hdfs bigdata sqoop

我有两个HDFS设置,想要将一些表从HDFS1复制(不迁移或移动)到HDFS2。如何将数据从一个HDFS复制到另一个HDFS?可以通过Sqoop或其他命令行吗?

6 个答案:

答案 0 :(得分:26)

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的运行时性能相比

答案 1 :(得分:13)

Hadoop附带了一个名为distcp的有用程序,用于并行地向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服务器的默认端口号。

答案 2 :(得分:6)

distcp用于并行地将数据复制到hadoop文件系统和从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选项从目标中删除源中不存在的文件或目录。

答案 3 :(得分:1)

尝试dtIngest,它是在Apache Apex平台上开发的。此工具将来自HDFS,共享驱动器,NFS,FTP,Kafka等不同来源的数据复制到不同的目的地。 dtIngest支持将数据从远程HDFS集群复制到本地HDFS集群。 dtIngest运行纱线作业以并行方式复制数据,所以它非常快。它负责故障处理,恢复等,并定期支持轮询目录以进行连续复制。

用法:dtingest [OPTION] ... SOURCEURL ... DESTINATIONURL 示例:dtingest hdfs:// nn1:8020 / source hdfs:// nn2:8020 / dest

答案 4 :(得分:0)

注意您可以使用源群集或目标群集运行基础MapReduce作业也很有用:

hadoop --config /path/to/hadoop/config distcp <src> <dst>

答案 5 :(得分:0)

distcp命令用于从一个群集并行复制到另一群集。您必须设置src的namenode的路径和dst的namenode的路径,在内部它使用mapper。

示例:

$ hadoop distcp <src> <dst>

您可以为distcp设置的选项很少

-m (否)。映射器复制数据,这将提高复制速度。

-atomic 用于自动提交数据。

-更新将仅更新旧版本的数据。

hadoop中有用于复制文件的通用命令-cp和-put,但仅在数据量较小时使用。