Apache flink StreamTask.getCheckpointLock弃用和自定义Flink源

Apache flink StreamTask.getCheckpointLock弃用和自定义Flink源,apache-flink,Apache Flink,在为Flink编写自定义检查点源时,必须确保下游发射元素、检查点和水印以同步方式发射。这是通过获取 现在建议在需要这种同步的操作中使用 我有一个自定义源代码实现,它分为多个阶段。一个SourceFunction[T]用于读取文件位置,一个OneInputStreamOperator用于下载并向下游发送这些元素。到目前为止,我使用streamsourcecontext.getSourceContext接收用于发出元素的SourceContext,如下所示: ctx = StreamSourceCo

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

现在建议在需要这种同步的操作中使用

我有一个自定义源代码实现,它分为多个阶段。一个
SourceFunction[T]
用于读取文件位置,一个
OneInputStreamOperator
用于下载并向下游发送这些元素。到目前为止,我使用
streamsourcecontext.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))

使用检查点锁仍然是向下游发射元素的首选方式吗?或者现在建议我们改用
MailboxExecutor
,并在邮箱执行线程中创建收集和水印?

源上下文中的检查点锁不受欢迎,因为目前无法实现没有锁的源。正是因为这个原因,这些源已经被称为遗留源:它们生成自己的线程,并且需要锁来发出数据(基于推送)

目前对sources()有一个更大的修改,它将提供一个基于拉的接口。此接口是从主任务线程调用的,因此不再需要同步。如果需要做一些异步工作,那么
MailboxExecutor
是一种方法


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

谢谢Arvid。我目前有一个分为多个阶段的源代码,这意味着文件列表是在
SourceFunction
中检索的,但还有第二个步骤是使用
AbstractStreamOperator
在转换函数中进行并行下载。因此,虽然在源上下文中锁没有被弃用,但它是针对所提到的操作符的。在这种情况下,是否应避免检索锁?在这种情况下,我应该向
getSourceContext
传递什么?是的,在您的下游操作中,操作员不应该再使用检查点锁。您应该在第二阶段使用
asyncIO
AsyncWaitOperator
),或者复制和调整该功能。通过查看邮箱,您隐式地获得了检查点锁定的行为,因为可以同时处理一封邮件或输入。我是否应该选择
AsyncWaitOperator
?目前,数据是从S3异步获取的,而不是从S3异步获取的。它完全是用于异步操作的,但通常只返回很小的结果,因此可能不适合您。不过,您可以将其作为起点。顺便说一句,您的功能听起来与
ContinuousFileReaderOperator
(由使用)非常相似。我几乎认为,我仍然想指出这一点
ContinuousFileReaderOperator
现在也在使用邮箱模型,因此它可能也是一个很好的起点。