有没有一种方法可以添加全局存储以供Transformer使用?在变压器文档中说:
“将输入流的每个记录转换为输出流中的零个或多个记录(键和值类型均可任意更改)。一个Transformer(由给定的TransformerSupplier提供)应用于每个输入记录并计算零或更多输出记录。为了分配状态,必须先通过addStateStore或addGlobalStore添加的存储区创建并注册状态,然后才能将其连接到Transformer。
还可以,addGlobalStore的API是否需要ProcessSupplier?
addGlobalStore(storeBuilder:StoreBuilder [_ <:StateStore], 主题:字符串, 已消耗:已消耗[_,], stateUpdateSupplier:ProcessorSupplier [,_])
我的最终目标是使用转换器的Kafka Streams DSL,因为我需要flatMap并将键和值都转换为我的输出主题。我的拓扑中没有处理器。
我期望这样的事情:
addGlobalStore(storeBuilder:StoreBuilder [_ <:StateStore],主题:字符串,已消耗:已消耗[_,],stateUpdateSupplier:TransformerSupplier [,_])
答案 0 :(得分:1)
传递到Processor
的{{1}}用于维护(即写入)商店。请注意,这是预计该addGlobalStore()
会将数据按原样复制到存储中的情况(参见https://issues.apache.org/jira/browse/KAFKA-7663)。
添加全局存储后,还可以添加Processor
,而Transformer
可以访问该存储。请注意,并不需要连接全局存储使其可用(仅需要添加“常规”存储)。另外请注意,Transformer
仅具有对全局存储的读取访问权限。
答案 1 :(得分:1)
在要从GlobalStateStore查找数据的用例中,对于要在输入主题上执行的所有转换,请使用Processor而不是Transformer。使用context.forward(key,value,childName)
将数据发送到下游节点。 context.forward(key,value,childName)
可能在process()
和punctuate()
中被多次调用,以便向下游节点发送多个记录。如果需要更新GlobalStateStore,请仅在传递给addGlobalStore(..)
的 Processor 中执行此操作,因为存在与GlobalStateStore相关联的GlobalStreamThread,它可以使存储状态在所有运行中保持一致kstream实例。