【问题标题】:Does Hadoop create multiple copies of input files, one copy per nodeHadoop 是否创建多个输入文件副本,每个节点一个副本
【发布时间】:2015-09-14 16:52:51
【问题描述】:

如果我希望将文件从本地目录复制到 HDFS,我是否需要在每个 Hadoop 节点上物理复制该文件? 或者如果我使用 hadoop dfs 命令,Hadoop 会在每个节点上内部创建该文件的副本?

我是否正确假设每个节点都需要一个文件的副本?

【问题讨论】:

    标签: hadoop hdfs


    【解决方案1】:

    当您复制文件(任何数据)时,Hadoop (HDFS) 会将其存储在任何Datanode 上,元数据信息将存储在Namenode 上。文件(数据)的复制将由Hadoop负责,您无需多次复制。

    您可以使用以下命令将文件从本地复制到 HDFS

    hdfs dfs -put <source> <destination>
    hdfs dfs -copyFromLocal <source> <destination>
    

    复制因子配置存储在hdfs-site.xml 文件中。

    我是否正确假设每个节点都需要一个文件的副本?

    这不一定是真的。 HDFS 根据hdfs-site.xml 文件中的配置创建副本。复制的默认值为 3。

    【讨论】:

      【解决方案2】:

      是的,hadoop 分布式文件系统在至少 3 个数据节点中复制数据。但是现在的趋势是火花,它也运行在 hadoop 之上。这比 hadoop 快 100 倍。

      火花http://spark.apache.org/downloads.html

      【讨论】:

        【解决方案3】:

        您不需要将文件从本地机器复制到集群中的每个节点。

        您可以使用诸如hadoop fshadoop dfs 命令之类的客户端实用程序来执行此操作。

        您的文件不必复制到集群中的所有节点,复制次数由hdfs-site.xml 配置文件中的dfs.replication 属性控制,其默认值为3,表示您的文件的 3 个副本存储在集群中的一些随机节点上。

        请参阅下面的更多详细信息,

        • hadoop dfs 命令首先与给定的Namenode 联系 文件的详细信息。

        • Namenode 计算文件必须的块数
          根据hdfs-site.xml中配置的块大小进行拆分

        • Namenode 为每个返回所选Datanodes 的列表 给定文件的计算块。 Datanodes 在每个 列表等于配置的复制因子 hdfs-site.xml
        • 然后hadoop客户端开始将文件的每个块存储到 给定 DatanodeHadoop Streaming
        • 对于每个块,hadoop 客户端只准备data pipe line 其中所有选择的Datanodes 被选择来存储块被形成 作为Data queue
        • hadoop 客户端只是将当前块复制到第一个 Datanode 在队列中。
        • 复制完成后,第一个 Datanode 将块级联到 队列中的第二个 Datanode 等等。
        • 文件的所有块详细信息和Datanodes的详细信息 将它们的副本保存在Namenode's metadata

        【讨论】:

          【解决方案4】:

          您不需要手动将文件复制到所有节点。 Hadoop 会负责将数据分发到不同的节点。

          您可以使用简单的命令将数据上传到 HDFS

          hadoop fs -copyFromLocal </path/to/local/file> </path/to/hdfs>
          

          hadoop fs -put </path/to/local/file> </path/to/hdfs>
          

          您可以在这里阅读更多数据是如何在 HDFS 上内部写入的:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html

          您还可以将文件从 HDFS 下载到本地文件系统,而无需使用命令从每个数据节点手动复制文件:

          hadoop fs -copyToLocal </path/to/hdfs/file> </path/to/local>
          

          hadoop fs -get  </path/to/hdfs/file> </path/to/local>
          

          【讨论】:

            猜你喜欢
            • 2017-08-13
            • 1970-01-01
            • 2018-09-20
            • 2021-03-26
            • 1970-01-01
            • 2020-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多