StreamTask.getCheckpointLock弃用和自定义Flink源

时间:2020-04-10 13:24:19

标签: apache-flink

为Flink编写自定义检查点源时,必须确保下游的发射元素,检查点和水印以同步方式发射。这是通过获取StreamContext.getCheckpointLock

来完成的

Flink 1.10 introduced a deprecation to StreamTask.getCheckpointLock,现在建议使用MailboxExecutor进行需要此类同步的操作。

我有一个定制的源实现,该实现分为多个阶段。 List用于读取文件位置,而SourceFunction[T]用于向下游下载和发布这些元素。到目前为止,我使用OneInputStreamOperator来接收用于发射元素的StreamSourceContexts.getSourceContext,如下所示:

SourceContext

此上下文在整个代码中都用于发出元素和水印:

ctx = StreamSourceContexts.getSourceContext(
      getOperatorConfig.getTimeCharacteristic,
      getProcessingTimeService,
      getContainingTask.getCheckpointLock,
      getContainingTask.getStreamStatusMaintainer,
      output,
      getRuntimeContext.getExecutionConfig.getAutoWatermarkInterval,
      -1
)

使用检查点锁还是向下游发射元素的首选方法吗?还是现在建议我们改用ctx.getCheckpointLock.synchronized(ctx.collect(item)) ctx.getCheckpointLock.synchronized(ctx.emitWatermark(watermark)) 并在邮箱执行线程中进行收集和添加水印?

1 个答案:

答案 0 :(得分:3)

不赞成在源上下文中使用检查点锁,因为当前没有办法在没有锁的情况下实现源。正是由于这个原因,这些源已经被称为旧源:它们产生自己的线程,并且需要锁来发射数据(基于推)。

当前对源(FLIP-27)进行了较大的返工,它将提供基于请求的界面。从主任务线程调用此接口,因此不再需要同步。如果需要完成一些异步工作,那么span是可行的方法。

仅供参考,新操作员应(而必须)仅使用MailboxExecutor而不是检查点锁定。