【问题标题】:Kylo | High Water Mark functionality凯洛 |高水位线功能
【发布时间】:2017-02-17 10:15:35
【问题描述】:

我每五分钟运行一次 Feed,并使用加载/释放蜂巢水印功能。考虑一个作业执行时间超过 5 分钟并且没有发生水印提交的场景。

在这种情况下,Kylo 会启动另一个带有旧水印的提要实例,还是会等待提交发生?

【问题讨论】:

    标签: kylo


    【解决方案1】:

    回答您的具体问题:

    如果您的 LoadHighWaterMark 处理器是 Feed 流中的第一个处理器(常见情况),那么当它在水印处于活动状态的 5 分钟后再次唤醒时,它实际上什么都不做(在删除任何创建的流文件),然后再等待 5 分钟以再次安排。处理器会先让出,但由于典型的让出时间少于 5 分钟,所以不会产生影响。

    如果您的 LoadHighWaterMark 处理器不是流中的第一个,则在 5 分钟唤醒后创建的流文件将重新排队,并且处理器将根据配置产生或惩罚该流文件.每次 Feed 处理时间超过 5 分钟时都会发生这种情况。

    所以你的问题的答案是,新的处理不会用旧的水印恢复,而是等待当前水印的提交或释放而不提交。上述两种情况假设了一个关于响应活动水印的典型配置,并且您的 Feed 行为正常,但处理特定批次的数据只需要超过 5 分钟。

    请注意,如果您的 Feed 处理其数据的平均时间超过 5 分钟,那么明智的做法是将 Feed 的时间表更改为高于 5 分钟的值,这样处理器的队列就不会得到备份。同样,仅当 LoadHighWaterMark 不是第一个处理器时才需要这样做。

    一般行为:

    如果当前正在由 LoadHighWaterMarkReleaseHighWaterMark 处理器限制的 Feed 的 NiFi 流部分内处理流文件,则没有其他流文件可以进入该部分直到当前处理流文件通过 ReleaseHighWaterMark 处理器退出该部分;水印是否被提交。您的流程序列被视为关键部分。这就是为什么每条流程路径,无论是成功路径还是失败路径,都必须通过某种 ReleaseHighWaterMark

    现在,当您的提要唤醒并尝试在水印处于活动状态时处理新的流文件时,NiFi 流行为由流中 LoadHighWaterMark 的位置及其配置决定。 Active Water Mark Strategy 设置会影响处理器在水印处于活动状态时到达流文件时的行为:

    • YIELD - 流文件将被删除(如果是第一个处理器)或重新排队,并且处理器将在其指定的屈服时间内屈服
    • PENALIZE - 流文件将受到惩罚;导致它重新排队
    • ROUTE - 流文件将立即被路由到 activeFailure 关系

    请注意,如果 LoadHighWaterMark 处理器是流中的第一个处理器(不涉及队列),则 PENALIZE 没有意义。所以设置 Active Water Mark StrategyPENALIZE 将被视为设置为 YIELD

    另一个影响行为的配置设置是Max Yield Count。此值指定在将流文件路由到 activeFailure 关系之前应尝试加载和处理活动水位标记的次数。因此,在您的场景中,如果最大计数设置为 3,并且当前的提要处理时间超过 20 分钟(5 分钟 X 4),那么从第四个开始的所有流文件将立即路由到 activeFailure 直到主动水印处理完成。此时,尝试计数将重置回 0,并且下一个到达的流文件将开始使用新的水位标记值进行处理。

    【讨论】:

      【解决方案2】:

      如果水印处于活动状态(即流文件加载了水印并正在处理它,但尚未释放它),则尝试再次加载相同水印的新流文件将被阻止。它将等待活动水印被释放(通过提交或拒绝)。

      您可以通过“LoadHighWaterMark”处理器上的“Active Water Mark Strategy”属性控制此行为。在处理卡住或花费比预期更长的时间时,这些可以提供帮助。如果策略设置为“Yield”,则处理器将在水印处于活动状态时让步。产量发生的次数是通过处理器属性“Max Yield Count”配置的。一旦达到这个产量计数,处理器会将流文件路由到“ActiveFailure”关系。每个产量的持续时间可以通过处理器上的 Settings -> Yield Duration 设置。如果策略设置为“Route”,处理器将立即将流文件路由到“ActiveFailure”关系。

      注意在叶 SuccessFailureActiveFailure 关系中使用“ReleaseHighWaterMark”处理器。它支持两种模式 - commitreject

      【讨论】:

        【解决方案3】:

        我需要确认这一点,但我的理解是,新的高水位线只有在当前的高水位线发布后才会运行。确保所有“成功”和“失败”关系都以 ReleaseHighWaterMark 处理器结束,这一点很重要。否则,您的提要最终可能会处于不一致的状态,即尚未发布高水位线但无法加载新的高水位线。

        【讨论】:

        • 感谢您的回复。你能确认一下行为吗?让我知道它是否需要 JIRA。
        猜你喜欢
        • 2011-01-26
        • 2011-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        相关资源
        最近更新 更多