NameNode如何识别特定文件复制的设置值,而不是已配置的复制3?

时间:2017-06-16 16:09:00

标签: hadoop hdfs replication

HD​​FS-site.xml中:

dfs.replication值配置3

假设我将特定文件的复制设置为2:

./ bin / hadoop dfs -setrep -w 2 /path/to/file.txt

  1. 当NameNode从DataNode收到心跳时,
  2. 将NameNode视为指定文件 path / to / file.txt是否按照配置的复制进行复制?

    如果没有,它将如何?

1 个答案:

答案 0 :(得分:2)

首先,我想尝试重述您的问题,以确保我明白:

NameNode会将手动设置为低于默认值(dfs.replication)的复制因子的文件视为不足复制吗?

没有。 NameNode将每个文件的复制因子分别存储在其元数据中,即使未通过调用-setrep显式设置复制因子也是如此。默认情况下,每个文件的元数据将复制dfs.replication中指定的复制因子(在您的示例中为3)。它可能会被覆盖,例如通过调用-setrep。当NameNode检查文件是否未被复制时,它会检查存储在该单个文件的元数据中的确切复制因子,而不是dfs.replication。如果文件的复制因子是2,并且每个块有2个副本,那么这很好,并且NameNode不会认为它不足以复制。

您的问题还提到了DataNodes的心跳,我认为这意味着您对DataNode和NameNodes之间的交互如何与复制相关联感兴趣。 DataNode和NameNodes之间还有另一种称为块报告的通信形式。块报告是DataNodes告诉NameNodes阻止它们存储的副本的方法。 NameNode分析来自所有DataNode的块报告,以确定块是否未被复制或过度复制。如果块未被复制(例如复制因子为2,但只有一个副本),则NameNode会调度重新复制工作,以便另一个DataNode制作副本的副本。如果块被过度复制(例如复制因子为3,但有4个副本),则NameNode会调度其中一个要删除的副本,最终其中一个DataNode将在本地删除它。