Apache flink 如何在任务之间共享二进制文件?

Apache flink 如何在任务之间共享二进制文件?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,假设我有某种二进制文件,我想在所有任务之间共享(例如,包含一个经过训练的ML模型)。如何使用DataStreamAPI实现这一点 虽然我知道在数据集API中有的概念,但似乎没有流媒体的等价物 我想也许我可以有一个自定义数据源,它发出一个值(我想要共享的Serializable,由Flink在闭包中捕获),并使用ValueStateDescriptor将其注册为可查询状态。这是一个可行的选择吗 我正在寻找类似的东西,这样我就可以允许我正在构建的东西的“客户机”在lambda中使用给定的共享变量,它

假设我有某种二进制文件,我想在所有任务之间共享(例如,包含一个经过训练的ML模型)。如何使用
DataStream
API实现这一点

虽然我知道在
数据集
API中有的概念,但似乎没有流媒体的等价物

我想也许我可以有一个自定义数据源,它发出一个值(我想要共享的
Serializable
,由Flink在闭包中捕获),并使用
ValueStateDescriptor
将其注册为可查询状态。这是一个可行的选择吗

我正在寻找类似的东西,这样我就可以允许我正在构建的东西的“客户机”在lambda中使用给定的共享变量,它们传递给“我的”操作符(基本上是Flink和其他引擎之上的抽象)


编辑:可查询状态不是一个选项,因为必须对其进行键控。

使用Flink的DataStream API有几种方法可以实现这一点。一种是在
open()
方法中使用并加载/初始化共享数据。如果该值不变,则该操作应该可以正常工作。另一种方法是将共享数据分发到任何需要的地方


需要应用经过训练的ML模型的典型流式应用程序将使用一些有状态的运算符来计算特征,然后将组合的特征向量馈送到加载了模型的
RichFlatMap

您是要在特定运算符的所有并行实例中共享此信息,还是在所有运算符的所有实例中共享此信息?在作业运行时,共享值是否会发生变化?@DavidAnderson跨越所有运算符的所有实例,并且值不会改变。考虑到我事先不知道哪个运算符必须使用它,我认为在使用大型二进制文件时,使用富函数不是一个很好的解决方案,我担心这会导致驱动程序和任务管理器之间的I/O过多。可能会进入可查询状态路径,这样我至少可以懒洋洋地加载它。您能编辑您的原始问题并提供更多解释吗?我不明白你想做什么。为什么你事先不知道哪个操作符需要这个二进制数据,为什么他们不能在知道需要的时候加载呢?如果是静态数据,则根本不需要由Flink管理。您不能简单地将数据加载到需要它的运算符的私有瞬态变量中吗?