HDFS联邦平衡指南

概述

HDFS Federation Balance是一个用于在不同联邦命名空间之间平衡数据的工具。它使用DistCp将数据从源路径复制到目标路径。首先在源路径创建快照并提交初始distcp,然后使用distcp diff进行增量复制直到源和目标一致。如果在RBF模式下工作,它会更新Router中的挂载表。最后将源数据移至回收站。

本文档旨在描述HDFS联邦平衡的使用和设计。

使用说明

基本用法

hdfs联邦平衡工具支持普通联邦集群和基于路由器的联邦集群。以rbf为例,假设我们在路由器中有一个挂载条目:

Source       Destination
/foo/src     hdfs://namespace-0/foo/src

以下命令运行一个hdfs联邦平衡作业。第一个参数是挂载条目。第二个参数是目标路径,必须包含目标集群。

bash$ /bin/hadoop rbfbalance -router submit /foo/src hdfs://namespace-1/foo/dst

它将数据从hdfs://namespace-0/foo/src增量复制到hdfs://namespace-1/foo/dst,并最终将挂载条目更新为:

Source       Destination
/foo/src     hdfs://namespace-1/foo/dst

如果hadoop shell进程意外退出,我们可以使用以下命令继续未完成的任务:

bash$ /bin/hadoop rbfbalance continue

这将扫描日志以查找所有未完成的任务,恢复并继续执行它们。

如果我们想在普通的联邦集群中实现负载均衡,请使用以下命令。

bash$ /bin/hadoop fedbalance submit hdfs://namespace-0/foo/src hdfs://namespace-1/foo/dst

在普通联邦模式下,源路径必须包含路径模式。

RBF模式与普通联邦模式

hdfs federation balance工具有两种模式:

  • 基于路由器的联邦模式(RBF模式)。
  • 常规联邦模式。

命令 rbfbalance 在基于路由器的联邦模式下运行。命令 fedbalance 在普通联邦模式下运行。

在rbf模式下,第一个参数被视为挂载点。通过将挂载点设置为只读来禁用写入。

在常规联邦模式下,第一个参数被视为源的完整路径。第一个参数必须包含源集群。它会通过取消源路径的所有权限来禁用写入。

有关禁用写入的详细信息,请参阅HDFS FedBalance

命令选项

命令 submit 有以下选项:

选项键 描述 默认值
-forceCloseOpen 在DIFF_DISTCP阶段没有差异时强制关闭所有已打开的文件。 等待直到没有打开的文件。
-map 用于复制的最大并发映射数。 10
-bandwidth 指定每个map任务的带宽(单位:MB)。 10
-delay 指定作业需要重试时的延迟时长(毫秒)。 1000
-moveToTrash This options has 3 values: trash (move the source path to trash), delete (delete the source path directly) and skip (skip both trash and deletion). By default the server side trash interval is used. If the trash is disabled in the server side, the default trash interval 60 minutes is used. trash
-diffThreshold 指定增量复制阶段使用的差异条目阈值。如果差异条目大小不超过该阈值且满足打开文件检查条件(无打开文件或强制关闭所有打开文件),fedBalance将进入distcp的最终轮次。设置为0表示等待直到没有差异为止。 0

配置选项


在hdfs-fedbalance-site.xml中设置配置选项。

配置键 描述 默认值
hdfs.fedbalance.procedure.work.thread.num BalanceProcedureScheduler的工作线程数。BalanceProcedureScheduler负责调度平衡作业,包括提交、运行、延迟和恢复。 10
hdfs.fedbalance.procedure.scheduler.journal.uri 日志的URI地址,该日志文件用于处理作业持久化和恢复。 hdfs://localhost:8020/tmp/procedure

HDFS联邦平衡架构

HDFS Federation Balance的组件可以分为以下几类:

  • 平衡程序调度器
  • HDFS联邦平衡

负载均衡调度程序

平衡程序调度器实现了一个状态机。它负责调度平衡作业,包括提交、运行、延迟和恢复。模型如下所示:

Balance Procedure Scheduler

  • 作业提交后,会被添加到待处理队列中。
  • 工作线程接收任务并执行它们。日志会被写入存储。
  • 如果写入日志失败,该作业会被添加到recoverQueue以便后续恢复。如果Worker线程捕获到RetryTaskException,它会将该作业添加到delayQueue。
  • Rooster线程从delayQueue中取出任务并将其重新添加到pendingQueue中。
  • 当调度器启动时,它会扫描日志中所有未完成的任务,并将它们添加到恢复队列。恢复线程会从日志中恢复这些任务,并将它们重新加入待处理队列。

HDFS FedBalance

HDFS FedBalance 是作为状态机的一个任务实现的。所有的 distcp 平衡逻辑都在这里实现。一个 HDFS FedBalance 任务包含 3 个步骤:

  • DistCpProcedure: 这是第一个流程。它负责处理所有的数据复制工作。包含6个阶段:

    • PRE_CHECK: 对源路径和目标路径进行预检查。
    • INIT_DISTCP: 创建源路径的快照并通过distcp复制到目标路径。
    • DIFF_DISTCP:使用-diff参数逐轮提交distcp以同步源路径和目标路径。如果设置了-forceCloseOpen参数,当源路径和目标路径之间没有差异时,此阶段将完成。否则,只有当没有差异且没有打开的文件时,此阶段才会完成。
    • DISABLE_WRITE: 禁用写入操作以防止源数据被修改。在路由器模式下,通过将挂载点设为只读实现;在普通联邦模式下,通过取消源路径的所有权限实现。
    • FINAL_DISTCP: 强制关闭所有打开的文件并提交最终的distcp。
    • FINISH: 执行清理工作。在普通联邦模式下,完成阶段还会恢复目标路径的权限。
  • MountTableProcedure: 该过程用于更新Router中的挂载表条目。会取消只读属性并更新挂载点的目标地址。此过程仅在基于路由器的联邦模式下激活。

  • TrashProcedure: 该过程将源路径移动到回收站。

所有3个流程完成后,平衡作业即完成。