Hadoop Namenode元数据- fsimage和编辑日志



我理解fsimage在启动时被加载到内存中,出于性能原因,任何进一步的事务都被添加到编辑日志中,而不是添加到fsimage中。

namenode重启时,内存中的fimage会刷新。为了提高效率,辅助名称节点定期执行检查点来更新fimage,以便更快地恢复名称节点。这些都很好。

但是有一点我不明白,假设一个文件已经存在,并且关于这个文件的信息在内存中的fimage中。现在我将该文件移动到另一个位置,该位置在编辑日志中更新。现在,当我尝试列出旧的文件路径时,它会抱怨它不存在或诸如此类。

这是否意味着namenode也会查看编辑日志,这与内存中的fimage的目的是矛盾的?或者它如何知道文件位置已经更改?

答案是查看编辑日志中的信息。如果在编辑日志中没有可用的信息,这个问题适用于我们将新文件写入hdfs的用例。当您的namenode运行时,如果您删除fsimage文件并尝试读取hdfs文件,它可以读取。

从正在运行的namenode中删除fsimage文件不会导致读写操作出现问题。当我们重新启动namenode时,会有错误指出没有找到映像文件。

让我试着给你更多的解释来帮助你。

仅在启动hadoop时查找fimage文件,如果它不在那里,namenode不会出现并记录格式化namenode。

hadoop format -namenode命令创建fsimage文件(如果有编辑日志)。namenode启动后,从编辑日志中获取文件元数据(如果在编辑日志中没有找到信息,则通过fsimage file搜索)。所以fimage只是作为检查点的信息保存上次。这也是次要节点与编辑日志保持同步(在1小时/100万事务之后)的原因之一,以便在从最后一个检查点启动时不需要同步太多内容。

如果您将safemode(命令:hdfs dfsadmin -safemode enter)打开并将使用saveNamespace(命令:hdfs dfsadmin -saveNamespace),它将显示下面提到的日志消息。

2014-07-05 15:03:13,195 INFO org.apache.hadoop.hdfs.server.namenode.FSImage: Saving image file /data/hadoop-namenode-data-temp/current/fsimage.ckpt_0000000000000000169 using no compression
2014-07-05 15:03:13,205 INFO org.apache.hadoop.hdfs.server.namenode.FSImage: Image file /data/hadoop-namenode-data-temp/current/fsimage.ckpt_0000000000000000169 of size 288 bytes saved in 0 seconds.
2014-07-05 15:03:13,213 INFO org.apache.hadoop.hdfs.server.namenode.NNStorageRetentionManager: Going to retain 2 images with txid >= 0
2014-07-05 15:03:13,237 INFO org.apache.hadoop.hdfs.server.namenode.FSEditLog: Starting log segment at 170

我回答这个问题有点晚了,但我认为值得更清楚地回答。

你想知道,如果元数据存储在编辑日志中,为什么在删除文件后,当我们试图列出旧文件路径时,它会抱怨它不存在或其他什么?namenode如何在不读取编辑日志的情况下知道文件或目录已被删除?

在Hadoop权威指南第11章中提到过:

当文件系统客户端执行写操作时(例如创建(或移动文件),事务首先记录在编辑日志中。namenode也有文件系统的内存表示元数据,它在编辑日志被修改后更新。内存中的元数据用于提供读请求。

话虽如此,答案很简单,因为在更新编辑日志之后,namenode会更新内存表示。因此,当接收到读请求时,它知道文件或目录已被删除,并会报错该文件或目录不存在。

整个文件系统命名空间,包括"块到文件的映射"和文件系统属性,都存储在一个名为FsImage的文件中。记住"块到文件的映射"是FsImage的一部分。它同时存储在内存和磁盘上。与FsImage一起,Hadoop还将在内存中存储,当名称节点(重新)启动和定期启动时,通过块报告将块映射到datanode。因此,当您将文件移动到另一个位置时,这将在磁盘上的编辑日志中被跟踪,并且当数据节点将块报告发送到namenode时,namenode将获得块在集群上位置的最新视图。这样,您将无法看到旧路径中的数据,因为块报告已经更新了"块到数据节点的映射"。但是请记住,更新只发生在内存中。现在经过一定的时间,无论是在检查点或当一个名称节点重新启动时,磁盘上已经有更新的编辑日志(在你的情况下移动文件)将与磁盘上的旧FsImage合并,并创建一个新的FsImage。现在这个更新后的FsImage将被加载到内存中,并重复同样的过程。

最新更新