过程是对 HBase 实体进行的转换。 HBase 实体的示例是区域和表格。过程由 ProcedureExecutor 实例运行。过程当前状态保存在 ProcedureStore 中。 ProcedureExecutor 只有一个原始视图,可以查看过程中发生的事情。从其 PoV,提交过程,然后 ProcedureExecutor 继续调用 #execute(Object),直到过程完成。在失败或重启的情况下,可以多次调用 Execute,因此每次运行时,过程代码必须是幂等的,产生相同的结果。程序代码也可以实现 _ 回滚 _,因此如果失败则可以撤消步骤。调用 execute() 可能会导致以下可能性之一:

  • execute() 返回

    • null :表示我们已经完成了。

    • :表示还有更多这样做,坚持当前程序状态并重新 _ 执行()_。

    • _ 子程序的数组 _:表示在我们继续之前需要运行完成的一组程序(之后我们希望框架再次调用我们的执行)。

  • execute() 抛出异常

    • suspend :表示程序的执行被暂停,并且由于某些外部事件可以恢复。过程状态是持久的。

    • yield :将程序添加回调度程序。过程状态不会持久化。

    • _ 中断 _:目前与 _ 产量 _ 相同。

    • 上面没有列出任何 _ 异常 _:程序 _ 状态 _ 变为 FAILED (之后我们期望框架将尝试回滚)。

ProcedureExecutor 将过程状态的框架概念标记到过程本身;例如它将程序标记为提交时的初始化。它在执行时将状态移动到 RUNNABLE。完成后,程序将标记为 FAILED 或 SUCCESS。以下是撰写本文时所有州的清单:

  • **INITIALIZING **施工程序,尚未加入执行人

  • **RUNNABLE **程序添加到执行程序中,准备执行。

  • **WAITING **该程序正在等待儿童(子程序)完成

  • **_WAITING TIMEOUT **程序正在等待超时或外部事件

  • **ROLLEDBACK **程序失败并被回滚。

  • **SUCCESS **程序执行成功完成。

  • **FAILED **程序执行失败,可能需要回滚。

每次执行后,Procedure 状态将持久保存到 ProcedureStore。在过程上调用挂钩,以便它们可以保留自定义状态。故障发生后,ProcedureExecutor 通过重放 ProcedureStore 的内容来重新补充其崩溃前状态。这使得过程框架可以抵御过程失败。

180.1。履行

在实施过程中,程序倾向于将变换划分为更细粒度的任务,并且当这些工作项中的一些被移交给子程序时,批量作为处理 _ 步骤 _ in-Procedure;每次执行 execute 都用于执行一个步骤,然后 Procedure 放弃返回到框架。程序会自行跟踪处理过程中的位置。

在执行过程中包含子任务或 _ 步骤 _ 的内容由程序作者决定,但通常它是一小部分工作,无法进一步分解并将处理向前移动到其最终状态。由许多小步骤而不是几个大步骤组成的程序允许程序框架提供关于我们在处理中的位置的洞察。它还允许框架在执行时更公平。如上所述,每个步骤可以被多次调用(失败/重启),因此步骤必须是幂等的。很容易混淆过程本身与框架本身保持一致的状态。尽量保持它们的区别。

180.2。回滚

当过程或其中一个子过程失败时,将调用回滚。回滚步骤应该清除 execute()步骤中创建的资源。如果失败并重新启动,可能会多次调用 rollback(),因此代码必须是幂等的。

180.3。度量

有关于提交程序和完成时收集指标的钩子。

  • updateMetricsOnSubmit()

  • updateMetricsOnFinish()

各个过程可以覆盖这些方法以收集过程特定的度量标准这些方法的默认实现尝试获取一个实现接口 ProcedureMetrics 的对象,该接口封装了以下一组通用度量:

  • SubmittedCount(Counter):提交类型的过程实例总数。

  • 时间(直方图):过程实例的运行时直方图。

  • FailedCount(Counter):失败的过程实例总数。

各个过程可以实现此对象并定义这些通用的度量标准集。

180.4。行李

程序可以携带行李。一个例子是 _ 步骤 _ 最后获得的程序(参见上一节);程序持续存在标记它们当前的位置。其他示例可能是 Procedure 当前正在运行的 Region 或 Server 名称。每次执行调用后,都会调用 Procedure#serializeStateData。程序可以坚持下去。

180.5。结果/状态和查询

(来自 Matteo 的 ProcedureV2 和 Notification Bus doc)在异步操作的情况下,必须保持结果,直到客户端请求它为止。一旦我们收到结果的“获取”,我们就可以安排删除记录。对于某些操作,结果可能是“不必要的”,尤其是在失败的情况下(例如,如果创建表失败,我们可以查询操作结果,或者我们可以只执行列表来查看它是否已创建)所以在某些情况下我们可以超时后安排删除。在客户端,操作将返回“过程 ID”,此 ID 可用于等待过程完成并获得结果/异常。

Admin.doOperation() { longprocId=master.doOperation(); master.waitCompletion(procId); }  + 

如果主机在执行操作时发生故障,备用主机将拾取半进行操作并完成它。客户端不会注意到失败。