如何成功完成名称节点重启并处理价值 5TB 的编辑文件

Kas*_*hei 5 hadoop hdfs namenode

我有一个名称节点,在紧急情况下必须关闭,该节点已经 9 个月没有获取 FSImage,并且有大约 5TB 的编辑文件需要在下次重新启动时处理。从大约 9 个月前开始,辅助名称节点就没有运行过(或执行过任何检查点操作),因此 FSImage 已经存在 9 个月了。

HDFS集群中大约有780万个inode。该机总内存约为260GB。

我们已经尝试了 Java 堆大小、GC 算法等的几种不同组合...但无法找到一种组合,可以让重新启动完成,而不会最终因 FGC 而减慢速度。

我有两个问题: 1. 有没有人找到一个名称节点配置,允许成功完成如此大的编辑文件积压?

  1. 我考虑过的另一种方法是重新启动名称节点,仅保留编辑文件的可管理子集。一旦名称节点启动并创建一个新的 FSImage,将其关闭,复制下一个编辑文件子集,然后重新启动它。重复此操作,直到处理完整组编辑文件。这种方法行得通吗?就系统和文件系统的整体稳定性而言,这样做安全吗?

Kas*_*hei 6

我们能够使用我在原始帖子的问题 (2) 中建议的版本来处理 5TB 积压的编辑文件。这是我们经历的过程:

解决方案:

  1. 确保名称节点与数据节点“隔离”。这可以通过关闭数据节点,或者在名称节点离线时将它们从从属列表中删除来完成。这样做是为了防止名称节点在处理整个积压的编辑文件之前无法与数据节点进行通信。
  2. 将整组编辑文件移动到dfs.namenode.name.dir名称节点hdfs-site.xml文件属性上配置的位置之外的位置。
  3. 将要处理的下一个编辑文件子集移动(或复制,如果您想维护备份)到该dfs.namenode.name.dir位置。如果您不熟悉 FSImage 和编辑文件的命名约定,请查看下面的示例。它有望澄清下一个编辑文件子集的含义。
  4. 更新文件seen_txid以包含您在步骤 (3) 中复制的子集中的最后编辑文件所表示的最后事务的值。因此,如果最后编辑的文件是edits_0000000000000000011-0000000000000000020,您需要将 的值更新seen_txid20。这实际上愚弄了名称节点,让其认为该子集是整个编辑文件集。
  5. 启动名称节点。如果您查看Startup ProgressHDFS Web UI 的选项卡,您将看到名称节点将以最新的 FSImage 启动,处理现有的编辑文件,创建一个新的 FSImage 文件,然后在等待时进入安全模式数据节点上线。
  6. 关闭名称节点
  7. 名称节点将edits_inprogress_########创建一个文件作为占位符。除非这是要处理的最后一组编辑文件,否则删除此文件。
  8. 重复步骤 3-7,直到完成所有积压的编辑文件。
  9. 启动数据节点。一旦名称节点能够确认多个数据块的位置,它就应该退出安全模式。
  10. 为集群设置辅助名称节点或高可用性,以便从现在开始定期创建 FSImage。

例子:

假设我们有 FSImagefsimage_0000000000000000010和一堆编辑文件:edits_0000000000000000011-0000000000000000020 edits_0000000000000000021-0000000000000000030 edits_0000000000000000031-0000000000000000040 edits_0000000000000000041-0000000000000000050 edits_0000000000000000051-0000000000000000060 ... edits_0000000000000000091-0000000000000000100

按照上述步骤操作:

  1. 所有数据节点都离线。
  2. 所有编辑文件都复制到dfs.namenode.name.dir另一个位置,例如:/tmp/backup
  3. 让我们一次处理 2 个文件。因此,复制edits_0000000000000000011-0000000000000000020edits_0000000000000000021-0000000000000000030移动到该dfs.namenode.name.dir位置。
  4. 更新seen_txid为包含值,30因为这是我们将在本次运行期间处理的最后一个事务。
  5. 启动名称节点,并通过 HDFS Web UI 的Startup Progress选项卡确认它是否正确用作fsimage_0000000000000000010起点,然后进行edits_0000000000000000011-0000000000000000020处理edits_0000000000000000021-0000000000000000030。然后它创建了一个新的 FSImage 文件 fsimage_0000000000000000030` 并进入安全模式,等待数据节点出现。
  6. 关闭名称节点
  7. 删除占位符文件edits_inprogress_########,因为这不是要处理的最终编辑文件集。
  8. 继续下一次运行并重复,直到处理完所有编辑文件。