我目前正在调整Nifi ExecuteSQLRecord的摄入。这里有多个方面,而在这个问题中,我感兴趣的是一个:摄入速度在多大程度上取决于xxxSetWriter的选择?
AFAIK,从Nifi深度:内容储存库,我了解到Content以某种二进制格式存储数据。那么CSVRecordSetWritter和AvroRecordSetWriter在ExecuteSQLRecord__中有什么区别呢?ExecuteSQLRecord是否将结果集转换为目标格式,然后以某种方式序列化?性能是否在很大程度上取决于选择?
我注意到,在大数据集中,将CSVRecordSetWritter改为AvroRecordSetWriter只会节省8-9%的数据量,并赢得ExecuteSQLRecord速度的10-15%左右。
我很确定SQL源和网络不是瓶颈。线程计数、GC、节点和内核的数量以及磁盘分区都超出了这个问题的范围。
发布于 2020-06-15 17:35:09
content以二进制格式存储数据,序列化流文件内容,但该内容是标准格式之一(在您的示例中是Avro或CSV )。NiFi在执行记录操作或转换时使用的“内部记录表示”仅存在于内存中,而不被保存到内容存储库中。
从SQL查询和Avro或CSV返回的规范记录格式转换的具体实现和性能成本不是我所知道的,您必须执行基准测试才能看到哪个更好(虽然我预计CSV会更快,因为Avro是一个更复杂的过程)。
如果您锁定了这么多变量,那么除了“要写入哪种格式”之外,真正唯一的决定就是处理器执行的调度 (运行计划、运行持续时间、产量持续时间)。我会尝试增加运行时间,以“执行更多的工作”每一个“存储库写”(昂贵的操作)。
https://stackoverflow.com/questions/62384329
复制相似问题