Apache flink 是否有一种与卡夫卡';阿帕奇·弗林克的KTable是什么?

Apache flink 是否有一种与卡夫卡';阿帕奇·弗林克的KTable是什么?,apache-flink,apache-kafka-streams,Apache Flink,Apache Kafka Streams,,在哪里 其中每个数据记录表示一次更新 基本上,我可以使用一个卡夫卡主题,并且只保留每个键的最新消息 Apache Flink中是否有类似的概念?我读过,但似乎没有解决同样的问题 比较和对比这两个框架会有所帮助。我不是在寻找哪个更好或更坏。而是他们的不同之处。答案是否正确取决于我的要求 你说得对。Flink的Table API及其Table类与Kafka的KTable不对应。表API是一种关系语言嵌入式API(想想Java和Scala中集成的SQL) Flink的DataStream API没有

,在哪里

其中每个数据记录表示一次更新

基本上,我可以使用一个卡夫卡主题,并且只保留每个键的最新消息

Apache Flink中是否有类似的概念?我读过,但似乎没有解决同样的问题


比较和对比这两个框架会有所帮助。我不是在寻找哪个更好或更坏。而是他们的不同之处。答案是否正确取决于我的要求

你说得对。Flink的Table API及其
Table
类与Kafka的KTable不对应。表API是一种关系语言嵌入式API(想想Java和Scala中集成的SQL)

Flink的DataStream API没有对应于KTable的内置概念。相反,弗林克提供了复杂的国家管理和KTable将是一个定期运营商与

例如,具有两个输入的有状态运算符存储从第一个输入观察到的最新值,并将其与从第二个输入观察到的值联接,可以使用
CoFlatMapFunction
实现,如下所示:

datastreamfirst=。。。
数据流秒=。。。
数据流结果=第一个
//连接第一个和第二个流
.连接(秒)
//在第一个(长)属性上为两个流设置关键帧
.keyBy(0,0)
//加入他们
.flatMap(新的TableLookup());
// ------
公共静态类表查找
扩展RichCoFlatMapFunction{
//键控状态
私人价值国家lastVal;
@凌驾
公共无效打开(配置配置){
ValueStateDescriptor ValueDescriptor=
新的ValueStateDescriptor(“表”,Types.STRING);
lastVal=getRuntimeContext().getState(valueDesc);
}
@凌驾
公共void flatMap1(Tuple2值,收集器输出)引发异常{
//使用字符串值更新当前长键的值。
更新(值.f1);
}
@凌驾
公共void flatMap2(Tuple2值,收集器输出)引发异常{
//查找当前长键的最新字符串。
字符串查找=lastVal.value();
//发出当前字符串和查找字符串
out.collect(Tuple2.of(value.f1,lookup));
}
}

一般来说,状态可以非常灵活地与Flink一起使用,让我们来实现各种各样的用例。还有更多的状态类型,例如和,您可以对时间进行细粒度控制,例如,如果某个密钥在一定时间内没有更新,则可以删除该密钥的状态(据我所知,KTables有相应的配置)。

我不确定这是否相同。如果您愿意,卡夫卡流中的
KTable
是一个“混合体”:物化状态以及下游changelog流。好吧,Flink没有changelog流的概念。因此,我想只有使用这种方法才能获得“状态部分”。这足以使用CoFlatMap实现KStream KTable查找联接——但这只是Kafka Streams中KTable的一个用例。事实上,从Flink中的任何有状态运算符发出changelog流都很容易。这只是编码变更的问题,所有下游操作员都需要知道如何处理输入变更日志流。在Flink中,更改日志流也不限于密钥上传更改日志,而是可以将更改编码为更灵活的累积和收回消息。这两种类型的变更日志都由使用。好的,KTables仅限于密钥上传更改。正确,KTables使用密钥上传。如果corse可以发出一个changelog流:但是所提供的DSL运营商都不会理解(他们会理解吗)——因此,您需要实现自己的运营商。总的来说,这是一个非常麻烦的方法来重新实现自己的一切弗林克还有其他优势。但是KTable/Changelog支持并不存在。Flink的关系API(表API和SQL)涵盖了Changelog支持。@FabianHueske当你说Changelog支持被涵盖时,我不确定是否会遵循?你能解释一下吗?我在Flink中根本看不到任何类似KTable的功能。动态表是Kafka流中的kstream,是的,您可以在更改日志流中转换动态表,但您必须自己重新构建KTable。如果你想比较两者,我建议你阅读Flink/dataArtisans以及Confluent博客:|和