【问题标题】:How to copy data from one HDFS to another HDFS?如何将数据从一个 HDFS 复制到另一个 HDFS?
【发布时间】:2015-10-30 00:33:38
【问题描述】:

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

【问题讨论】:

    标签: hadoop hdfs bigdata sqoop


    【解决方案1】:

    DistCp(分布式副本)是一种用于在集群之间复制数据的工具。它使用 MapReduce 来影响其分布、错误处理和恢复以及报告。它将文件和目录列表扩展为映射任务的输入,每个任务都将复制源列表中指定的文件的一个分区。

    用法:$ hadoop distcp <src> <dst>

    例如:$ hadoop distcp hdfs://nn1:8020/file1 hdfs://nn2:8020/file2

    file1nn1 复制到 nn2,文件名为 file2

    Distcp 是目前最好的工具。 Sqoop 用于将数据从关系数据库复制到 HDFS,反之亦然,但不能在 HDFS 到 HDFS 之间复制。

    更多信息:

    有两个版本可用 - distcp2 的运行时性能比 distcp 更高

    【讨论】:

    • 我想从 mainFrame 获取大文件到 hdfs .. 你建议什么方法?我可以将它们复制到 unix 并使用 phython 解析它们。如果它们是小文件。请建议
    • @vikrantrana - 这可能有助于blog.cloudera.com/blog/2014/10/…
    • @Avinash Reddy。谢谢。似乎该链接建议使用 sqoop 从 pds 导入大型机文件数据。我猜它只会以二进制形式登陆,之后我们需要将它转换为 ascii 并在 hdfs 上解析它以使其分隔。是这种方法还是我们可以做其他事情。请推荐
    • @vikrantrana 我不熟悉大型机数据格式。由于您指的是移动大文件,因此最好先登陆数据,然后通过有效利用并行处理进行转换。
    【解决方案2】:

    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 选项从目标中删除源中不存在的文件或目录。

    【讨论】:

    • 我在尝试复制时遇到...原因:java.net.ConnectException:连接在 sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) 被拒绝
    【解决方案3】:

    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 服务器的默认端口号。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        还需要注意的是,您可以像这样使用源集群或目标集群运行底层 MapReduce 作业:

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

        【讨论】:

        • 我在尝试复制时遇到...原因:java.net.ConnectException:连接在 sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) 被拒绝
        【解决方案6】:

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

        例子:

        $ hadoop distcp <src> <dst>
        

        你可以为 distcp 设置几个选项

        -m 表示没有。用于复制数据的映射器,这将提高复制速度。

        -atomic 用于自动提交数据。

        -update 只会更新旧版本的数据。

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

        【讨论】:

        • 我在尝试复制时遇到...原因:java.net.ConnectException:连接在 sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) 被拒绝
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-18
        • 1970-01-01
        • 2018-05-24
        • 2021-07-29
        • 2018-10-01
        • 2019-11-14
        • 2016-12-10
        相关资源
        最近更新 更多