Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在卡夫卡主题中仅存储最新的键值_Scala_Apache Kafka_Apache Kafka Streams_Spring Kafka - Fatal编程技术网

Scala 如何在卡夫卡主题中仅存储最新的键值

Scala 如何在卡夫卡主题中仅存储最新的键值,scala,apache-kafka,apache-kafka-streams,spring-kafka,Scala,Apache Kafka,Apache Kafka Streams,Spring Kafka,我有一个主题,它有一个数据流。我需要的是从这个主题中创建一个单独的主题,该主题只包含给定键的最新值集 我认为KTable的全部目的是存储给定键的最新值,而不是存储整个事件流。然而,我似乎无法让这个工作。运行下面的代码会生成密钥库,但该密钥库(maintopiclatest)中有一个事件流(不仅仅是最新的值)。因此,如果我两次发送主题中包含1000条记录的请求,而不是看到1000条记录,我会看到2000条记录 var serializer = new KafkaSpecificRecordSeri

我有一个主题,它有一个数据流。我需要的是从这个主题中创建一个单独的主题,该主题只包含给定键的最新值集

我认为KTable的全部目的是存储给定键的最新值,而不是存储整个事件流。然而,我似乎无法让这个工作。运行下面的代码会生成密钥库,但该密钥库(maintopiclatest)中有一个事件流(不仅仅是最新的值)。因此,如果我两次发送主题中包含1000条记录的请求,而不是看到1000条记录,我会看到2000条记录

var serializer = new KafkaSpecificRecordSerializer();
var deserializer = new KafkaSpecificRecordDeserializer();

var stream = kStreamBuilder.stream("maintopic",
    Consumed.with(Serdes.String(), Serdes.serdeFrom(serializer, deserializer)));

var table = stream
    .groupByKey()
    .reduce((aggV, newV) -> newV, Materialized.as("maintopiclatest"));

另一个问题是,如果我想将KTable存储在一个新主题中,我不知道该怎么做。为了做到这一点,我似乎必须把它变成一个流,这样我就可以调用它的“.to”。但是它包含了整个事件流,而不仅仅是最新的值。

这不是KTable的工作方式

KTable本身有一个内部状态存储,每个键只存储一条记录。但是,KTable会不断更新,并受到所谓的流表二元性的影响。对KTable的每次更新都作为更改日志记录发送到下游:。因此,每个输入记录产生一个输出记录

因为它是流处理,所以没有“每个值的最后一个键”

我有一个主题,它有一个数据流。我需要的是从这个主题中创建一个单独的主题,该主题只包含给定键的最新值集


您希望KTable在哪个时间点发出更新?这个问题没有答案,因为输入流在概念上是无限的。

为什么不使用日志压缩主题?@Mukeshprajapati这是我尝试的第一件事,但似乎日志压缩也不像宣传的那样有效。不管我如何调整与它相关的各种配置设置,它似乎都不会立即生效。我读到它只有在特定的条件下,在存在一定数量的数据后才会生效。然后我读到了关于KTables的内容,这让我觉得它们正是为这种情况而设计的,即只需要给定键的最新值。然而,它具有所有的历史价值。我认为KTable的整个用途类似于数据库表,只按键存储“最新”的值——这是正确的,但您必须将其视为随时间变化的“快照”。“我很困惑”--经常发生这种情况--这是一种完全不同的方法,你需要建立一个新的心智模型(需要时间…)--你还必须区分当前的KTable状态和它的changelog主题--当前状态每个键只存储一条记录--然而,changelog主题存储一段时间内的更新。只有在压缩changelog主题后,旧值才会被删除,每个键只保留最新记录。请注意,如果处理KTable,则不处理快照,而是处理变更日志主题。-KTables是具体化的客户端(默认情况下使用RocksDB键值存储)。如果要“时间点”查找当前KTable状态,可以使用“交互式查询”:“当前状态”表示“当前处理状态”--如果执行
builder.table(“主题”)
默认情况下,处理从最早的偏移开始。因此,在处理过程中,使用完整的主题并更新KTable状态。假设上游生产者应用程序不断写入
“topic”
,处理永远不会完成(请注意,这是正常情况,因为它是流处理)。因此,在处理过程中,“当前状态”是指与“开始到当前偏移量”(当前偏移量<主题结束偏移量)的数据相对应的状态。因此,不清楚“当前状态”是什么意思——如果您假设没有上游生产者写入
“主题”
,到达主题末尾后,不会更新KTable(当然,应用程序仍在运行,等待对主题的新写入,它将立即使用该写入来更新KTable)。在任何时间点,您都可以使用IQ查询状态,它将返回存储中的任何内容(取决于atm处理的时间点)。如果没有更新发生,你会得到“最新状态”很明显。正确。对于
toStream()
它提供了完整的历史记录(请注意,
toStream()
在到达输入主题末尾时不会开始处理,但它在处理输入主题的同时运行——它基本上会在处理时创建所有表更新的changelog流)。如果要迭代存储中的所有键(对于某些“快照”),可以通过
store.all()
使用IQ。