【问题标题】:Order of operators initialization in FlinkFlink 中的算子初始化顺序
【发布时间】:2021-11-30 15:12:32
【问题描述】:

我有一个 Flink 工作,具有 datasource-operator1-operatorN-sink 的经典形状。

据我观察,operator1open() 方法在datasourceopen() 方法之前被调用。

operator1open() 方法中,我需要处理一些业务逻辑,它依赖于在datasource.open() 得到解决的东西

1- 有什么方法可以限制operator1.open() 直到datasource.open() 才被调用?
2- 有什么方法可以从datasource.open() 方法到operator1.open() 方法进行通信/发送信号?

【问题讨论】:

  • 我不相信这是可能的。但是你想解决什么潜在的问题?也许我们可以提出另一种方法。
  • DS 是有状态的,并且在恢复状态(读取的最后一条记录)方面工作良好......在下游,我们有一个异步函数将记录拟合到外部服务。根据业务需求,异步功能也需要从同一记录中恢复。我也尝试对异步函数进行检查点...但是根据我的观察,异步函数检查点的最后一条记录可能与数据源快照的记录不完全相同。我正在寻找一种机制,以便异步函数在数据源恢复其状态之前不会启动,并将其传达给异步函数

标签: apache-flink flink-streaming


【解决方案1】:

试图在运营商之间建立某种带外通信通常会给人们带来麻烦。充其量它会破坏性能,最坏的情况是它会导致死锁。

您可能会尝试依赖数据源和异步函数之间已经存在的信号通路——换句话说,从数据源发出一个特殊编码的事件,告诉异步函数它现在可以启动,并让异步函数在执行其他处理之前等待该特殊记录。

【讨论】:

  • 最终,这就是我所做的。我退出了检查点异步操作符。失败后,数据源发出的第一个事件会带一个特殊标志,我只在异步函数的 run() 方法中处理它一次,而不是 open()。再次感谢大卫
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多