首页 > 解决方案 > 如何在 flink 流中动态序列化参数

问题描述

我有一个params要在 flink 流中序列化的参数,

class P extend Serializable {...}

val params = new P(...)
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.addSource(new MySource(params))
   .map(new MyMap(params))
   .addSink(new MySink(params))
env.setParallelism(1)
env.execute("My Job")

但是驱动程序节点中的参数会发生变化,我需要params在作业运行期间更新到执行程序。是否有可能基于不停止 flink 流作业?

标签: apache-flinkflink-streaming

解决方案


简而言之,答案是否定的。因为每次有新记录出现时,您的 UDF 都需要 [反] 序列化参数,这会减慢执行速度。

但是,您可以通过扩展AbstractUdfStreamOperator并在转换操作中调用它来实现自己的流运算符。我在这里做了一个例子:“在 Flink 中实现我自己的流操作符来处理数据倾斜”。

然后您决定操作员何时读取新参数。例如,只需创建一个计划为每 10 分钟一次的新线程。参数文件必须放置在操作员将运行的所有节点上。


推荐阅读