【发布时间】:2015-09-14 16:52:51
【问题描述】:
如果我希望将文件从本地目录复制到 HDFS,我是否需要在每个 Hadoop 节点上物理复制该文件? 或者如果我使用 hadoop dfs 命令,Hadoop 会在每个节点上内部创建该文件的副本?
我是否正确假设每个节点都需要一个文件的副本?
【问题讨论】:
如果我希望将文件从本地目录复制到 HDFS,我是否需要在每个 Hadoop 节点上物理复制该文件? 或者如果我使用 hadoop dfs 命令,Hadoop 会在每个节点上内部创建该文件的副本?
我是否正确假设每个节点都需要一个文件的副本?
【问题讨论】:
当您复制文件(任何数据)时,Hadoop (HDFS) 会将其存储在任何Datanode 上,元数据信息将存储在Namenode 上。文件(数据)的复制将由Hadoop负责,您无需多次复制。
您可以使用以下命令将文件从本地复制到 HDFS
hdfs dfs -put <source> <destination>
hdfs dfs -copyFromLocal <source> <destination>
复制因子配置存储在hdfs-site.xml 文件中。
我是否正确假设每个节点都需要一个文件的副本?
这不一定是真的。 HDFS 根据hdfs-site.xml 文件中的配置创建副本。复制的默认值为 3。
【讨论】:
是的,hadoop 分布式文件系统在至少 3 个数据节点中复制数据。但是现在的趋势是火花,它也运行在 hadoop 之上。这比 hadoop 快 100 倍。
【讨论】:
您不需要将文件从本地机器复制到集群中的每个节点。
您可以使用诸如hadoop fs 或hadoop dfs 命令之类的客户端实用程序来执行此操作。
您的文件不必复制到集群中的所有节点,复制次数由hdfs-site.xml 配置文件中的dfs.replication 属性控制,其默认值为3,表示您的文件的 3 个副本存储在集群中的一些随机节点上。
请参阅下面的更多详细信息,
hadoop dfs 命令首先与给定的Namenode 联系
文件的详细信息。
Namenode 计算文件必须的块数
根据hdfs-site.xml中配置的块大小进行拆分
Namenode 为每个返回所选Datanodes 的列表
给定文件的计算块。 Datanodes 在每个
列表等于配置的复制因子
hdfs-site.xml
Datanode 到 Hadoop Streaming。data pipe line
其中所有选择的Datanodes 被选择来存储块被形成
作为Data queue。Datanode 在队列中。Namenode's metadata。【讨论】:
您不需要手动将文件复制到所有节点。 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>
【讨论】: