在创建Apache NiFi控制器服务时,我有兴趣了解何时创建新服务以及何时重新共享现有服务。
当前,我在根进程组中有一个CsvReader
和CSVRecordSetWriter
,它们在子进程组中被大量复用。我试图将它们设置为尽可能动态和灵活,以涵盖尽可能广泛的用例。我在每个当前这样设置Schema Text属性:
Reader Schema Text: ${avro.schema:notNull():ifElse(${avro.schema}, ${avro.schema.reader})}
Writer Schema Text: ${avro.schema:notNull():ifElse(${avro.schema}, ${avro.schema.writer})}
我有一个非常常见的模式,就是将来自不同来源的具有不同字段的文件映射为一种通用格式(通用模式)。因此,一种想法是使用ConvertRecord
或UpdateRecord
处理器,并将avro.schema.reader
和avro.schema.writer
属性设置为输入和输出模式。然后,我将让编写者始终设置avro.schema
属性,以便每次我在流中再次读取记录时,都默认使用avro.schema
。离开读者和作家模式属性徘徊感觉很脏。从架构的角度来看,还有更好的方法吗?为什么会有大量的控制器服务在不同级别徘徊?除了某些用例可能需要不同的设置之外,我是否还缺少任何内容?
还在好奇其他人如何组织他们的模式?我不需要在不同处理器块或引用不同版本的不同位置重复使用它们,因此集中它们或维护架构注册表服务器似乎是一种浪费,当我只能使用{{ 1}}。
答案 0 :(得分:0)
最后,我决定将控制器分为两个控制器更为合理。一种用于从模式A 到模式B 的转换,另一种用于在添加新属性时使用与普通/默认读取器和写入器相同的avro.schema
属性。这允许在处理器块配置时显式选择正确的模式,而不是依赖于单个处理器的隐式配置。另外,当您只需要调整这两种模式之一的设置时,您将获得不停止所有流(只是一个子集)的额外好处。