Kafka Streams建立StateStoreSupplier:API澄清

时间:2018-01-22 23:49:36

标签: apache-kafka-streams rocksdb stream-processing

我正在使用版本0.11.0.2的Kafka Streams。

为了提升transform API,我使用StateStoreSupplier构建器方法创建了自己的Stores.create。问题是对我来说某些字段/方法的javadoc不够清楚。

val storeSupplier = Stores.create(STORE_NAME)
            .withStringKeys()
            .withStringValues()
            .persistent()
            .disableLogging()
            .windowed(WINDOW_SIZE, RETENTION, 3, false)
            .enableCaching()
            .build()

如何提及更改日志?

/**
* Indicates that a changelog should not be created for the key-value store
*/
PersistentKeyValueFactory<K, V> disableLogging();

这4个值如何相互影响?每个窗口都有最大数量的元素 - windowSize?一旦到达新窗口就开始了?对于RocksDB,每个窗口可以在磁盘上划分为numSegments个文件?重复意味着键和值都相同,只能在同一个窗口中检测到它?

 /**
 * Set the persistent store as a windowed key-value store
 * @param windowSize size of the windows
 * @param retentionPeriod the maximum period of time in milli-second to keep each window in this store
 * @param numSegments the maximum number of segments for rolling the windowed store
 * @param retainDuplicates whether or not to retain duplicate data within the window
 */
PersistentKeyValueFactory<K, V> windowed(final long windowSize, long retentionPeriod, int numSegments, boolean retainDuplicates);

这里暗示了什么样的缓存?

/**
* Caching should be enabled on the created store.
*/
PersistentKeyValueFactory<K, V> enableCaching();

1 个答案:

答案 0 :(得分:2)

我可以自信地回答这些问题中的2/3:

  

如何提及更改日志?

更改日志是一个名为$applicationId-$storename-changelog的主题。它是一个简单的键值主题,其中键是表键,值是表值。本主题由Kafka Streams创建和管理。如果你做disableLogging,据我所知,如果在没有重放你的整个拓扑结构的情况下(如果它是可重放的话)丢失,商店将无法恢复;

  

这里暗示了什么样的缓存?

访问底层RocksDB实例之前的LRU内存缓存。具体请参见CachedStateStoreCachedKeyValueStore,例如CachedKeyValueStore#getInternal()

关于:

  

这4个值如何相互影响?每个窗口都有最大数量的元素 - windowSize?一旦到达新窗口就开始了?对于RocksDB,每个窗口可以划分为磁盘上的numSegments文件?重复意味着键和值都相同,只能在同一个窗口中检测到它?

我最近没有仔细看过这些内部结构以便完全记住。我可以说以下内容:

  • 除非您使用的是内存中的LRU存储,否则每个窗口都没有最大数量的元素。 Windows是按时间存在的,因此您的条目会根据时间落入窗口或多个窗口,而不是窗口容量(通常没有固定容量)。 更新:需要注意的一件重要事情是,如果您使用的是缓存存储,则只会按偏移提交间隔指定的间隔定期刷新到磁盘。如果此类缓存商店支持KTable,则KTable仅在topology commits and the store flushes时将邮件转发给其子女。
  • 是的,我相信每个窗口都分为磁盘上的段。我最近没有仔细查看代码,但我可能错了。请参阅RocksDBSegmentedBytesStore及其相关性Segments
  • 在此上下文中不确定重复项。