停止与取消Flink作业

时间:2018-07-21 09:56:53

标签: apache-flink flink-streaming

我们有几个正在运行的Flink(1.5)作业。 他们中的大多数人都使用Kafka 0.8.2.2作为来源(我们正在努力升级Kafka,但这是另一回事了。)

我们的一些作业正在使用Flink会话窗口机制,而有些则未使用(仅映射/过滤事件的简单作业)。 另外,某些作业正在使用AsyncIO来丰富来自外部数据库的事件。

我们不时发现要为这些现有工作添加的错误或小功能。

为防止数据丢失,我们cancel(使用savepoint)进行相关作业,部署新的更新作业并从上一个savepoint开始再次运行。

问题在于,在大多数情况下,我们尝试从最后一个savepoint运行时遇到异常,这是有道理的,因为我们更改了作业代码,并且无法将savepoint加载到记忆,对吧?

问题是,我们可以承受延迟(稍后将缩小差距),但我们不能承受数据丢失。

sawstop CLI操作看起来很有希望,因为它应该优雅地执行。

  • 优雅的stop操作支持哪些Flink源?有支持该功能的Kafka版本吗?水槽类型也相关吗? (接收器接收器是否想完成向S3的上传?)
  • stop命令是否支持使用Windows的作业?如果是这样,它在会话窗口中的行为如何?
  • 在不丢失数据的情况下更新现有/正在运行的Flink作业的最佳实践是什么?

编辑:有时由于AsyncIO超时,我们也会在cancel命令中看到它(例外)-

java.lang.Exception: An async function call terminated with an exception. Failing the AsyncWaitOperator.
    at org.apache.flink.streaming.api.operators.async.Emitter.output(Emitter.java:137)
    at org.apache.flink.streaming.api.operators.async.Emitter.run(Emitter.java:85)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.concurrent.ExecutionException: java.util.concurrent.TimeoutException: Async function call has timed out.
    at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357)
    at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1895)
    at org.apache.flink.streaming.api.operators.async.queue.StreamRecordQueueEntry.get(StreamRecordQueueEntry.java:68)
    at org.apache.flink.streaming.api.operators.async.Emitter.output(Emitter.java:129)
    ... 2 more
Caused by: java.util.concurrent.TimeoutException: Async function call has timed out.
    at org.apache.flink.streaming.api.operators.async.AsyncWaitOperator$1.onProcessingTime(AsyncWaitOperator.java:212)
    at org.apache.flink.streaming.runtime.tasks.SystemProcessingTimeService$TriggerTask.run(SystemProcessingTimeService.java:281)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    ... 1 more

0 个答案:

没有答案