apache flink中的状态函数

oymdgrw7  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(474)

我研究了ApacheFlink的新的有状态函数2.0API。我阅读了以下文档链接https://ci.apache.org/projects/flink/flink-statefun-docs-stable/. 我还运行了git repo中的示例(https://github.com/ververica/stateful-functions/tree/master/stateful-functions-examples)关于执行我有几个问题。
https://flink.apache.org/stateful-functions.html -->有一个例子,这是交易评分欺诈检测在页面的最后。
第一个问题是关于状态ttl。我怎样才能把国家交给ttl?示例说明:30天后,“欺诈计数”函数将收到一条过期消息(来自它自己)并清除其状态。我应该做这个手册还是有其他的功能?我怎么做这个手册?
关于keyedstream的第二个问题。例如:将存在多个“欺诈计数”示例-例如,每个客户帐户一个。我应该把价值观 PersistedTable<K,V> ? 例如 <customerid,count> . 我可以清除特定键的状态吗?
最后一个问题是关于窗口和水印。如何将这些功能实现到状态函数2.0?

v7pvogib

v7pvogib1#

第一个问题是关于状态ttl。我怎样才能把国家交给ttl?示例说明:30天后,“欺诈计数”函数将收到一条过期消息(来自它自己)并清除其状态。我应该手动操作还是有其他功能?我怎么做这个手册?
您可以使用延迟消息手动执行此操作。实际上,您可以通过在延迟时向自己发送消息来创建回调触发器。此消息是持久的,在发生故障时不会丢失。如果您查看欺诈计数函数,在模型服务示例中,您将看到它正是这样做的。当收到一个值时,一个ttl消息以30天的延迟发送。当收到该消息时,计数递减。
关于keyedstream的第二个问题。例如:将存在多个“欺诈计数”示例-例如,每个客户帐户一个。我应该将值设置为persistentable吗?例如。我可以清除特定键的状态吗?
所有函数示例都是“keyed”的,因为用户代码总是在一个键的作用域内调用,所有持久化的字段都是在该键的作用域内调用的。密钥是地址的“id”组件。在您的示例中,可以有一个函数“customerfunction”,用于跟踪业务中每个客户的信息。当您想要与该客户交互时,您将向它发送消息,指定客户uid作为地址的“id”。

new Address(new FunctionType("ns", "customer"), "customer-id-1");

如果您要跟踪每个客户的计数,您只需要一个persistedvalue,因为它已经限定到该客户id的范围。回到欺诈计数示例,该函数限定在“帐户id”上,它跟踪每个银行帐户的欺诈交易数。
最后一个问题是关于窗口和水印。如何将这些功能实现到状态函数2.0?
statefun 2.0不直接支持这些功能。使用windows的原因是,它们主要适用于数据处理,而不是应用程序开发。对于这些用例,使用flink的datastream和tableapi可能会更好,尽管可以自己在用户代码中实现它们。
活动时间很棘手。事件时间是使用引擎盖下的“水印”来跟踪系统内的时间进程。它们依赖于数据相对于水印的有序性。这意味着,如果事件x在2:00的水印前具有1:59的时间戳,则它必须始终位于该水印前。否则,此准时记录将被标记为迟到。
有状态函数基于迭代和任意消息传递。因为记录可以在数据流中向任何方向移动,所以事件时间没有很好的定义。

相关问题