Machine learning 在Flink中序列化复杂模型的最佳实践

Machine learning 在Flink中序列化复杂模型的最佳实践,machine-learning,apache-flink,Machine Learning,Apache Flink,我正在使用UDF将一些ML模型应用于数据流。由于Flink无法自动序列化模型类(来自第三方库),因此我使用两个变量,如下所示: MyUDF类扩展了KeyedCoProcessFunction[字符串、模型定义、数据、预测] 使用CheckpointedFunction{ //保存已加载的模型 @暂时私有var模型:HashMap[(字符串,字符串),模型]=_ //用于序列化目的 @瞬态专用var模型字节:MapState[(字符串,字符串),数组[字节]=_ ... } 其中: model

我正在使用UDF将一些ML模型应用于数据流。由于Flink无法自动序列化
模型
类(来自第三方库),因此我使用两个变量,如下所示:

MyUDF类扩展了KeyedCoProcessFunction[字符串、模型定义、数据、预测] 使用CheckpointedFunction{ //保存已加载的模型 @暂时私有var模型:HashMap[(字符串,字符串),模型]=_ //用于序列化目的 @瞬态专用var模型字节:MapState[(字符串,字符串),数组[字节]=_ ... } 其中:

  • models
    保存加载(运行)的模型(从
    ModelDef
    创建,基本上是一个字符串)
  • modelsBytes
    是真实(键控)状态,它保存相同的模型,但作为一个字节块,因此检查点工作良好
整体解决方案很简单(只需要在恢复/保存模型时在模型上调用
fromBytes
/
toBytes
),但我不知道这是否是一种常见/最佳做法。在本质上相同的事情上有两个变量看起来很奇怪。例如,您可以找到一个使用
TypeSerializer[Option[Model]]
的示例,它看起来更简洁,但实现起来也更复杂

因此,基本上:

  • 我应该使用
    TypeSerializer
    方法还是使用某种复制状态来运行/序列化模型是可以的

  • 另外,如果您能给我指出一些关于Flink中自定义类型序列化的文档/示例,那就太好了,通常我发现官方文档在这方面有点欠缺


为了性能而对数据进行明智的非规范化是一种非常常见的模式。如果没有使用太多内存,请坚持使用这种方法。

我可能会使用堆状态后端和自定义的
类型序列化程序

堆状态后端将仅序列化检查点上的数据,否则将保持数据不变。因此,当您使用该后端而过度管理映射本身时,几乎没有性能损失。但是,它将不再需要手动执行序列化和同步