【问题标题】:Ideal way of debugging complex NiFi dataflow调试复杂 NiFi 数据流的理想方法
【发布时间】:2018-09-12 20:16:00
【问题描述】:

根据我在使用 NiFi 构建一些 DB 摄取 PoC 后的理解,整个数据流作为流文件流运行。并且在任何特定时间,执行控制可以同时在一个或多个处理器上。

所以我真的很困惑如何为任何故障调试复杂的数据流。

我的 PoC 工作流程本身看起来像这样。

当我们使用生产用例时,它可能会变得比这复杂得多。所以我有几个问题。

  1. 如何知道数据流的状态。如果假设 10 个分叉流文件中有 4 个因数据库池错误而在 GenerateTableFetch 失败,我如何知道哪些失败以及如何快速重放它们而无需去数据来源并一一进行。

  2. 有没有办法通过查看数据流来知道哪个处理器的哪个流文件出现故障。

我对使用 NiFi 调试数据流有更多的疑问/困惑,如果有人可以向我指出一些文档或分享最佳实践,那将很有帮助。

谢谢。

【问题讨论】:

    标签: apache-nifi hortonworks-data-platform hortonworks-dataflow


    【解决方案1】:

    1- 如何知道数据流的状态。如果让我们说 4 out 10 用于数据库池的 GenerateTableFetch 分叉流文件失败 错误,我如何知道哪些失败以及如何快速重播它们 不用去数据治理,一一做。

    您可以通过将类型故障的关系或任何其他类型的故障发送到进程组来处理错误,这取决于您使用的处理器类型。

    就像 Bryan 提到的那样,您不希望它们自动终止,除非您不在乎。

    2- 有没有办法通过查看数据流来知道 处理器发生故障的流文件。

    是的 - 您必须设置“公告级别”来区分日志级别

    如何管理失败的 NiFi 流?

    你需要成为 BuletinBoard 的好朋友,请参阅此处 SiteToSiteStatusReportingTask 或者你可以使用 InvokeHttp 来对抗原生 NiFI Rest ApiGET 调用 http://nifi-server:port/nifi-api/flow/bulletin-board,这将响应一个详细的 json 对象,该对象可以被解析,然后推送到 PutSlack/PutEmail/PutSNS 以解决任何错误。

    拥有 共享进程组 来处理任何传入的错误流文件也是理想的,此 PG 将使用规则和路由构建,以应用于 NiFi 服务器中的所有数据流逻辑。拥有 PG 特定属性至关重要,这些属性将随您的所有流一起携带并在数据流的过程中使用。

    例如:

    进程组“Demo”有一个名为Set PG Attributes的处理器,它设置PGName属性,PGType属性,FailEmailTitle 属性等。如果我的流程在任何时候失败,故障关系将根据 Set PG Attributes 处理器中设置的属性之一的值路由我的失败流程

    这是我当前设置的图表,其中我将所有故障发送到同一个共享 PG。

    其他选项

    如果您认为公告仅持续 5 分钟是一个问题,那么您可以使用 nifi-app.log,它可以设置为由 / 中的规则填充opt/nifi/conf/logback.xml 文件

      <logger name="org.apache.nifi" level="ERROR"/>
        <logger name="org.apache.nifi.processors" level="DEBUG"/>
        <logger name="org.apache.nifi.processors.standard.LogAttribute" level="ERROR"/>
        <logger name="org.apache.nifi.processors.standard.LogMessage" level="ERROR"/>
        <logger name="org.apache.nifi.controller.repository.StandardProcessSession" level="ERROR" />
    

    因此,您可以让 tailFile 处理器查看您的本地日志文件并获取错误信息或您认为对您有用的信息并从中获得一些意义。

    【讨论】:

    • 感谢您的详细解答。我仍然对公告不太满意。一旦它从处理器的顶角消失,我不知道从哪里回头检查问题所在。而且我相信它只会在那里显示 5 分钟。主菜单的公告也没有信息。但是您分享的博客链接很有帮助。我将阅读有关 ReportingTasks 的内容。
    【解决方案2】:

    每个处理器都应该有一个或多个故障关系。由您决定如何处理故障......在某些情况下,您可以将故障关系路由回同一处理器以继续重试,在其他情况下,您可以将其路由到 PutFile 处理器并将其写出到本地磁盘以检查内容,或者您​​可以将其路由到 PutEmail 处理器以向某人发送电子邮件。

    你不想做的是自动终止失败关系,因为你实际上是在说你想忽略它。

    【讨论】:

    • 有道理。我想尝试将失败关系路由到 self 以进行重试。但我希望它有一些额外的条件,比如它应该在重试之前等待大约 2 分钟,并且应该重试一些固定的次数。也许我必须在路由回处理此要求的故障关系之前添加另一个进程组。
    • 所有这些都可以完成,但作为数据流设计者,您可以再次决定什么对您的用例有意义,您可以创建一个像 kisstechdocs.wordpress.com/2015/01/15/… 这样的重试循环,并且可以使用 ControlRate 控制重试的速度
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多