添加全局存储以供变压器使用

时间:2019-03-02 21:28:42

标签: apache-kafka-streams

有没有一种方法可以添加全局存储以供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 [,_])

2 个答案:

答案 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实例。