当我多个任务往同一个数据库表做upsert时,容易造成死锁,有什么机制可以让flink sink时超时就放弃吗?
可以去了解一下有种机制叫做“Checkpointing”。Checkpointing可以帮助你在多个任务往同一个数据库表做upsert时,避免死锁的发生。它可以让Flink在每次sink时,都会检查是否有其他任务正在操作同一个表,如果有,则会等待一段时间,如果超时则放弃。
这个改一下sink不就好了,catch一下异常自己加下异常策略的处理.
此答案来自钉钉群“【2】Apache Flink China 社区”
楼主你好,Flink 提供了一种名为 “RetryingFailedSinkFunction”的机制,可以在Sink出现失败时进行重试。这个机制通过在sink调用时设置超时和最大重试次数,可以在遇到死锁等情况时,自动重试sink操作,以便尽可能地消除死锁的影响。例如:
DataStream<T> stream = ...;
stream.addSink(new RetryingFailedSinkFunction(new MySink(), 3, Time.seconds(30)));
在这个例子中,MySink() 是用户自定义的 SinkFunction,3 表示最大重试次数,Time.seconds(30) 表示每次重试之间的间隔时间为 30 秒。当SinkFunction失败时,RetryingFailedSinkFunction 会自动重试,直到达到最大重试次数或者成功为止。
在Flink 1.12及以上版本中,还引入了一个新的机制叫做 “Write-Ahead Log (WAL)”,它可以在Sink出现故障时自动恢复数据。通过启用WAL,Flink会在数据到达Sink之前,先将数据写入WAL文件中,如果Sink出现故障,Flink可以使用WAL文件来恢复Sink中的数据。WAL机制可以减少数据丢失的风险,但也会增加系统的开销和延迟。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。