为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))
并在邮箱执行线程中进行收集和添加水印?
答案 0 :(得分:3)
不赞成在源上下文中使用检查点锁,因为当前没有办法在没有锁的情况下实现源。正是由于这个原因,这些源已经被称为旧源:它们产生自己的线程,并且需要锁来发射数据(基于推)。
当前对源(FLIP-27)进行了较大的返工,它将提供基于请求的界面。从主任务线程调用此接口,因此不再需要同步。如果需要完成一些异步工作,那么span
是可行的方法。
仅供参考,新操作员应(而必须)仅使用MailboxExecutor
而不是检查点锁定。