我可以(应该)像使用内存数据库一样使用 Flink 吗?
can (should) I use Flink like an in-memory database?
我使用过批处理 Beam,但对流媒体界面不熟悉。我想知道使用类似于内存数据库的 Apache Flink/Beam 是否合适——我想根据边缘触发的更新不断地重新计算和具体化我的数据的一个特定视图。
更多细节:我在一个(普通)数据库中有几个 table ,从几千到几百万行不等,每个都与其他数据库有多对多(M2M)关系.图片说明:
Hosts <-M2M #1-> Table 1 <-M2M #2-> Table 2 <-M2M #3-> Table 3
Table 1
是hosts需要知道的一组对象,每个hosts都需要知道Table 1
中的对象直接或间接引用的所有下游行与其相关.当更改发生在第一个多对多关系 M2M #1
以外的任何地方时,如果不遍历“左”来查找主机然后遍历“右”来获取所有必要的配置,那么哪些主机需要更新是不明显的.大多数级别的对象和关系经常变化,我需要亚秒级延迟才能从“记录或关系发生变化”到重新计算任何包含更改的扁平化配置文件,以便我可以非常快速地将更新推送到主机。
这是流式传输 Flink / Beam 的合适用例吗?我曾在不同的系统中使用过 Beam,但只是在批处理模式下,我认为如果我可以边缘触发它,它会是一个很好的工具。我遇到的问题是,在批处理模式下,PCollections
都是“完整的”,因为我总是可以将所有记录合并到一个 table 中,所有记录都合并到另一个 table.但是对于流式传输,一旦我处理了一条记录,它就会从它的 PCollection
中删除,并且不能加入到以后到达并与之相关的未来更新中,对吗? IIUC,它仅在 window 中可用,但我实际上想要一个无限长的 window,其中只有 PCollection
中项目的过时版本(例如,它们的版本已被新版本覆盖通过流进入的版本)将被释放。
(此外,对于 bootstrap 这个系统,我需要扫描整个数据库以预填充所有状态,然后才能开始读取边缘触发更新流。这是一种常见模式吗? )
我对 Beam 的了解还不足以回答这部分问题,但您当然可以按照您描述的方式使用 Flink。使用 Flink 完成此操作的最简单方法是使用 SQL/Table API 进行流连接。运行时会将两个表具体化为托管 Flink 状态,并在从输入表处理新记录和更新记录时产生新的 and/or 更新结果。这是一个常用的模式。
至于最初引导状态,在继续摄取更新之前,我建议使用 CDC-based 方法。您可以先查看 https://github.com/ververica/flink-cdc-connectors.
我使用过批处理 Beam,但对流媒体界面不熟悉。我想知道使用类似于内存数据库的 Apache Flink/Beam 是否合适——我想根据边缘触发的更新不断地重新计算和具体化我的数据的一个特定视图。
更多细节:我在一个(普通)数据库中有几个 table ,从几千到几百万行不等,每个都与其他数据库有多对多(M2M)关系.图片说明:
Hosts <-M2M #1-> Table 1 <-M2M #2-> Table 2 <-M2M #3-> Table 3
Table 1
是hosts需要知道的一组对象,每个hosts都需要知道Table 1
中的对象直接或间接引用的所有下游行与其相关.当更改发生在第一个多对多关系 M2M #1
以外的任何地方时,如果不遍历“左”来查找主机然后遍历“右”来获取所有必要的配置,那么哪些主机需要更新是不明显的.大多数级别的对象和关系经常变化,我需要亚秒级延迟才能从“记录或关系发生变化”到重新计算任何包含更改的扁平化配置文件,以便我可以非常快速地将更新推送到主机。
这是流式传输 Flink / Beam 的合适用例吗?我曾在不同的系统中使用过 Beam,但只是在批处理模式下,我认为如果我可以边缘触发它,它会是一个很好的工具。我遇到的问题是,在批处理模式下,PCollections
都是“完整的”,因为我总是可以将所有记录合并到一个 table 中,所有记录都合并到另一个 table.但是对于流式传输,一旦我处理了一条记录,它就会从它的 PCollection
中删除,并且不能加入到以后到达并与之相关的未来更新中,对吗? IIUC,它仅在 window 中可用,但我实际上想要一个无限长的 window,其中只有 PCollection
中项目的过时版本(例如,它们的版本已被新版本覆盖通过流进入的版本)将被释放。
(此外,对于 bootstrap 这个系统,我需要扫描整个数据库以预填充所有状态,然后才能开始读取边缘触发更新流。这是一种常见模式吗? )
我对 Beam 的了解还不足以回答这部分问题,但您当然可以按照您描述的方式使用 Flink。使用 Flink 完成此操作的最简单方法是使用 SQL/Table API 进行流连接。运行时会将两个表具体化为托管 Flink 状态,并在从输入表处理新记录和更新记录时产生新的 and/or 更新结果。这是一个常用的模式。
至于最初引导状态,在继续摄取更新之前,我建议使用 CDC-based 方法。您可以先查看 https://github.com/ververica/flink-cdc-connectors.