Apache nifi 如何避免NiFi中的flowfile故障记录?

Apache nifi 如何避免NiFi中的flowfile故障记录?,apache-nifi,Apache Nifi,我有一个json文件,有将近500.000条记录,其中有些记录解析错误,或者双引号放错了位置。问题是,当我尝试更新记录时,会出现一条警告,告诉我哪些是故障记录,但我无法加载任何其他有效记录 我使用的处理器是: GetFile->UpdateAttribute->ConvertCharacterSet->->->UpdateRecord->PutParquet GetFile->用于获取文件 UpdateAttribute->更新某些属性(不重要) 将characterset->ASCII转换为U

我有一个json文件,有将近500.000条记录,其中有些记录解析错误,或者双引号放错了位置。问题是,当我尝试更新记录时,会出现一条警告,告诉我哪些是故障记录,但我无法加载任何其他有效记录

我使用的处理器是:

GetFile->UpdateAttribute->ConvertCharacterSet->->->UpdateRecord->PutParquet

GetFile->用于获取文件

UpdateAttribute->更新某些属性(不重要)

将characterset->ASCII转换为UTF-8,因为我在记录中有áéíóúñ字符

UpdateRecord->屏蔽一条记录

PutParquet->将文件保存在parquet中

我不知道如何将UpdateRecord中的好记录发送到PutParquet,将坏记录发送到错误日志

可能我需要另一个处理器,但我尝试了validateRecord,但没有工作(可能配置不好)

我的记录中的失败示例:


2020-10-06 01:47:23,471 ERROR org.apache.nifi.processors.standard.UpdateRecord: UpdateRecord[id=36473d38-5d59-1fae-82c1-5f46f50cbfab] Failed to process StandardFlowFileRecord[uuid=0152318c-d126-4c48-8b2e-3f41413724b8,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1601948827512-2676, container=default, section=628], offset=0, length=1587131043],offset=0,name=auditoria_20200929.txt.prq,size=1587131043]; will route to failure: org.apache.nifi.processor.exception.ProcessException: IOException thrown from UpdateRecord[id=36473d38-5d59-1fae-82c1-5f46f50cbfab]: org.codehaus.jackson.JsonParseException: Unexpected character ('B' (code 66)): was expecting double-quote to start field name
 at [Source: java.io.BufferedInputStream@35fab6ff; line: 179249, column: 393373]

2020-10-06 01:47:52,539 ERROR org.apache.nifi.processors.parquet.PutParquet: PutParquet[id=f7baa377-0174-1000-b6f3-ee3d6768eadd] Failed to write due to org.codehaus.jackson.JsonParseException: Unexpected character ('B' (code 66)): was expecting double-quote to start field name
 at [Source: java.io.BufferedInputStream@8295d5; line: 179249, column: 393373]: org.codehaus.jackson.JsonParseException: Unexpected character ('B' (code 66)): was expecting double-quote to start field name
 at [Source: java.io.BufferedInputStream@8295d5; line: 179249, column: 393373]
org.codehaus.jackson.JsonParseException: Unexpected character ('B' (code 66)): was expecting double-quote to start field name
 at [Source: java.io.BufferedInputStream@8295d5; line: 179249, column: 393373]
我们的想法是把所有的失败记录发送给制造它们的人

我的更新记录配置:

更新记录


ValidateRecord将是一种合乎逻辑的方式,因此您可能需要进一步调试ValidateRecord配置


或者,您可以引入一个SplitRecord处理器,将每条记录拆分为单独的流文件,这样一个转换失败不会影响任何其他记录,并且您可以根据需要将失败路由到任何地方。但是,这确实会带来开销,并可能影响流的整体性能。

一个潜在的解决方法:

  • 在创建时将JSON数据转换为UTF-8编码
  • $NIFI_ROOT/conf/bootstrap.conf
    中添加一个参数,将
    -Dfile.encoding=UTF-8
    添加到早期的JVM参数中。它需要在参数顺序的早期,就像在Xmx和Xms之后一样。这将加载默认编码设置为UTF-8的JVM。我不知道Linux上需要它,但Windows上的默认字符集不是UTF-8 AFAIK
  • 如何确定“错误记录”?