apache-flink - StreamTask.getCheckpointLock 弃用和自定义 Flink 源
问题描述
在为 Flink 编写自定义检查点源时,必须确保下游的发射元素、检查点和水印以同步的方式发射。这是通过获取StreamContext.getCheckpointLock
Flink 1.10 引入了对 StreamTask.getCheckpointLock 的弃用,现在推荐使用MailboxExecutor
需要这种同步的 for 操作。
我有一个自定义源实现,它分为多个阶段。一个SourceFunction[T]
用于读取文件位置,一个OneInputStreamOperator
用于下载和向下游发送这些元素。到目前为止,我曾经StreamSourceContexts.getSourceContext
收到 SourceContext
used to emit 元素,如下所示:
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
改用并在邮箱执行线程中制作收集和水印?
解决方案
源上下文中的检查点锁不被弃用,因为目前没有办法在没有锁的情况下实现源。正是因为这个原因,这些源已经被称为遗留源:它们产生自己的线程并且需要锁来发出数据(基于推送)。
目前对源 ( FLIP-27 ) 进行了较大的返工,它将提供基于拉取的界面。该接口是从主任务线程调用的,因此不再需要同步。如果需要完成一些异步工作,那么MailboxExecutor
就是要走的路。
仅供参考,新运营商应该(而必须)只使用MailboxExecutor
而不是检查点锁。
推荐阅读
- java - java - 如何使用正则表达式java删除删除以仅从字符串中获取数值?
- matplotlib - 使用 matplotlib 添加文本
- php - PHP:数组中的字符串换行
- amazon-web-services - 如何让 OpenCart 加载资源
- acumatica - Acumatica - 报表设计器
- javascript - React.js 渲染组件后滚动到顶部
- java - Jpanel文本框没有输出
- omnet++ - APP:错误:收到未知类型的自我消息
- javascript - Javascript计算2个状态
- amazon-web-services - AWS Fargate 上的 Strapi 部署(无服务器)-Aurora MySQL(无服务器)