Apache nifi 如何在NiFi上对大型Json文件进行两阶段拆分

Apache nifi 如何在NiFi上对大型Json文件进行两阶段拆分,apache-nifi,Apache Nifi,我使用NiFi进行恢复,并将许多数据放入卡夫卡。我实际上处于测试阶段,我正在使用一个大的Json文件 我的Json文件包含500K条录音 实际上,我有一个处理器getFile用于获取文件,还有一个SplitJson JsonPath表达式:$…posts. 这种配置适用于包含50K录制的小文件,但对于大文件,她崩溃了 我的Json文件是这样的,在“posts”中有500K个注册表:[] { "meta":{ "requestid":"request1000",

我使用NiFi进行恢复,并将许多数据放入卡夫卡。我实际上处于测试阶段,我正在使用一个大的Json文件

我的Json文件包含500K条录音

实际上,我有一个处理器
getFile
用于获取文件,还有一个
SplitJson

JsonPath表达式:
$…posts.

这种配置适用于包含50K录制的小文件,但对于大文件,她崩溃了

我的Json文件是这样的,在
“posts”中有500K个注册表:[]

{ 
    "meta":{ 
        "requestid":"request1000",
        "http_code":200,
        "network":"twitter",
        "query_type":"realtime",
        "limit":10,
        "page":0
    },
    "posts":[ 
        { 
            "network":"twitter",
            "posted":"posted1",
            "postid":"id1",
            "text":"text1",
            "lang":"lang1",
            "type":"type1",
            "sentiment":"sentiment1",
            "url":"url1"
        },
        { 
            "network":"twitter",
            "posted":"posted2",
            "postid":"id2",
            "text":"text2",
            "lang":"lang2",
            "type":"type2",
            "sentiment":"sentiment2",
            "url":"url2"
        }
    ]
}
我阅读了一些关于这个问题的文档,但主题是文本文件,发言者建议链接许多
SplitText
以逐步拆分文件。对于像我的Json这样的僵硬结构,我不明白如何才能做到这一点

我正在寻找一个解决方案,让她能够很好地处理500K录音。

尝试在NiFi中使用处理器

在SplitRecord processor中定义记录服务

然后将每次拆分的
记录配置为
1
,并使用
Splits
关系进行进一步处理

(或)

如果你想平铺和分叉记录,那么在NiFi中使用处理器


用于此链接。

不幸的是,我认为这种情况(记录中的大数组)现在处理得不是很好

SplitJson要求将整个流文件读入内存,并且它也没有传出拆分大小。所以这行不通

SplitRecord通常是正确的解决方案,但目前有两个JSON记录读取器—JSONterReader和JsonPathReader。这两个流记录,但这里的问题是只有一个巨大的记录,因此它们将各自将整个文档读入内存

围绕这个特定的问题已经做了一些努力,但不幸的是,没有一个已经发布

现在已关闭的PR添加了一个新的JSON记录读取器,它可以从JSON路径开始对记录进行流式处理,在您的情况下,可以是$.posts:

使用该阅读器,您甚至不需要进行拆分,只需将流文件发送到PublishKafkarRecord_2_0(或PublishKafkarRecord的任何适当版本),它将读取每条记录并发布到Kafka

新的SelectJson处理器也有一个开放的PR,看起来它可能会有帮助:


我对json也有同样的问题,并用于编写流式解析器

ExeuteGroovyScript
处理器与 下面的代码

它应该将大的传入文件拆分为小文件:

@Grab(group='acme.groovy',module='acmejson',version='20200120')
导入groovyx.acme.json.AcmeJsonParser
导入groovyx.acme.json.AcmeJsonOutput
def ff=session.get()
如果(!ff)返回
def objMeta=null
def计数=0
ff.read().withReader(“UTF-8”){reader->
新建AcmeJsonParser().withFilter{
onValue('$.meta'){
//记住以后用
objMeta=it
}
onValue('$.posts.[*]'){objPost->
def ffOut=ff.clone(false)//不包含内容的克隆
ffOut.post_index=count//使用索引添加属性
//编写小型json
ffOut.write(“UTF-8”){writer->
writeJson([meta:objMeta,post:objPost],writer,true)
}

REL_SUCCESS你解决了这个问题吗?@daggett不,我会尝试读写器,但问题是一样的……我会尝试SplitRecord的解决方案,但问题是一样的。我使用的是Hortonworks,所以我认为JSON记录读取器没有在我的Nifi版本上实现。读写器控制器的问题是一样的。
{
  "meta": {
    "requestid": "request1000",
    "http_code": 200,
    "network": "twitter",
    "query_type": "realtime",
    "limit": 10,
    "page": 0
  },
  "post": {
    "network": "twitter",
    "posted": "posted11",
    "postid": "id11",
    "text": "text11",
    "lang": "lang11",
    "type": "type11",
    "sentiment": "sentiment11",
    "url": "url11"
  }
}