Kafka Streams-创建窗口状态存储

时间:2018-11-13 06:55:44

标签: apache-kafka-streams

下面的代码“有效”,但我对Stores.persistentWindowStore()中传递的值的含义感到困惑。我找到了文档(https://kafka.apache.org/10/javadoc/org/apache/kafka/streams/state/Stores.html#persistentWindowStore-java.lang.String-long-int-long-boolean-),但是对我来说,参数的定义不清楚。

windowBy()值是否应始终与persistentWindowStore()中的windowSize相匹配?

保留期限应设置为什么?源主题的保留政策?

段数是多少?

保留重复项的用途是什么?文档似乎表明对联接设置为true?

long windowSize = TimeUnit.MINUTES.toMillis(15);
long retentionPeriod = windowSize*4*6 //6 hours
int numSegments = 2;
boolean retainDuplicates = false;

bdrStream.groupByKey().windowedBy(TimeWindows.of(windowSize))
    .aggregate(() -> Lists.newArrayList(),
        (aggKey, newValue, aggValue) -> {
            BdrData d = new BdrData();
            d.setCharge(newValue.getBdr().getCost());
            aggValue.add(d);
            return aggValue;
        },
        Materialized.<String, ArrayList<BdrData>>as(
            Stores.persistentWindowStore("store5", 
                retentionPeriod, 
                numSegments, 
                windowSize,
                retainDuplicates))
                .withKeySerde(Serdes.String())
                .withValueSerde(listBdrDataSerde))
    .toStream()
    .process(() -> new WindowAggregatorProcessor());

1 个答案:

答案 0 :(得分:3)

  

windowBy()值是否始终与persistentWindowStore()中的windowSize相匹配?

是的

  

保留期限应设置为什么?源主题的保留政策?

它应与您可以通过Windows#until()指定的窗口的保留期限匹配(默认为1天)

  

段数是多少?

段的数量确定粗/细粒度数据(即旧窗口)如何过期。段大小将为“保留期/(#段+ 1)”。请注意,更多的段可让您获得更细粒度的数据到期时间,但会增加开销(每个段使用它自己的RocksDB实例)

  

保留重复项的用途是什么?文档似乎表明对联接设置为true?

默认情况下,键必须是唯一的。如果启用保留重复项,则可以多次存储同一密钥。启用重复功能会降低性能。

注意:

API的这一部分在即将到来的2.1版本中进行了重新设计和简化。比较KIP-319KIP-328了解详情。