问题描述
我有一个将近500.000条记录的json文件,其中有些记录解析错误或在错误的位置加了双引号。问题是当我尝试UpdateRecord时出现警告,告诉我哪些是失败记录,但我无法加载其他任何有效记录。
我正在使用这种安全的处理器:
GetFile-> UpdatAttribute-> ConvertCharacterSet->-> UpdateRecord-> PutParquet
UpdateAttribute->更新某些属性(无关紧要)
ConvertCharacterSet-> ASCII转换为UTF-8,因为我在记录中有ééíóúñ字符。
UpdateRecord->屏蔽一条记录
PutParquet->要将文件保存在Parquet中。
我不知道如何将更新记录中的好记录发送到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],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]
这个想法是将所有失败记录发送给创建它们的人。
我的UpdateRecord配置:
UpdateRecord
解决方法
ValidateRecord将是顺理成章的方法,因此也许您需要对ValidateRecord配置进行更多调试。
或者,您可以引入SplitRecord处理器将每个记录拆分为单独的FlowFiles-那么一个转换失败将不会影响任何其他记录,并且您可以将失败路由到任何需要的地方。但是,这确实会带来开销,并且可能会影响流程的整体性能。
,可能的解决方法:
- 在创建时将JSON数据转换为UTF-8编码。
- 在
$NIFI_ROOT/conf/bootstrap.conf
中添加一个参数,该参数将-Dfile.encoding=UTF-8
添加到早期的JVM参数中。它需要早于参数顺序,就像我认为在Xmx和Xms之后一样。这将以默认编码设置为UTF-8加载JVM。我不知道Linux上是否需要它,但是Windows上的默认字符集不是UTF-8 AFAIK。