You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by "casel.chen" <ca...@126.com> on 2022/11/29 00:38:18 UTC

flink sql作业无缝升级问题

线上有一个流量较大的flink sql作业需要升级添加业务字段,当前主要是kafka (canal) 多表关联写入 mongodb 数据同步场景,除了source offset外无其他状态,如何让用户对升级无感呢?
常规的停止作业再启动作业至少要几十秒,会造成消息积压告警,有没有可能先启新作业待运行平稳后再停止老作业?kafka group使用同一个,作业启动从group-offsets开始可以吗?另外,如果是有大状态作业又要如何无缝升级?

Re: flink sql作业无缝升级问题

Posted by yidan zhao <hi...@gmail.com>.
应该是不行,必须先停止。

除非业务层面做了改动,像我业务的话我支持动态配置消费数据的开始结束时间的过滤。这样假设当前作业为A,当前时间9点55分,先动态设置A消费到10点就停止。在10点前启动新作业B,并设置作业B从10点的作业开始消费。这样10点之后比如10点5分左右确认作业A已经消费完10点前数据且sink完就可以停止了。

否则没办法,指定相同group也不可以的应该,我记得flink是使用主动assign分区的方式使用kafka的,因此如果前后作业同时存在,实际是重复消费,不存在共享消费的概念。

刘超 <li...@foxmail.com> 于2022年12月1日周四 09:36写道:
>
> kafka group使用同一个,作业启动从group-offsets开始,如果没有状态的作业是可以的,但是如果存在状态的话,可能不太行。
> 最好的办法就是等流量下来后,再进行一个切换&nbsp;
>
>
>
>
> 刘超
> liuchao1019@foxmail.com
>
>
>
> &nbsp;
>
>
>
>
> ------------------&nbsp;原始邮件&nbsp;------------------
> 发件人:                                                                                                                        "user-zh"                                                                                    <liujiangangpeng@gmail.com&gt;;
> 发送时间:&nbsp;2022年11月30日(星期三) 晚上8:08
> 收件人:&nbsp;"user-zh"<user-zh@flink.apache.org&gt;;
>
> 主题:&nbsp;Re: flink sql作业无缝升级问题
>
>
>
> Flink目前无法做到无缝升级,需要走stop-with-savepoint、start
> job的流程,但是在这之间可以做一些优化来缩短恢复时间。比如,把新作业先启动起来,申请好资源,同时停掉老作业,将做好的savepoint用来触发新作业的执行。
>
> casel.chen <casel_chan@126.com&gt; 于2022年11月29日周二 08:38写道:
>
> &gt; 线上有一个流量较大的flink sql作业需要升级添加业务字段,当前主要是kafka (canal) 多表关联写入 mongodb
> &gt; 数据同步场景,除了source offset外无其他状态,如何让用户对升级无感呢?
> &gt; 常规的停止作业再启动作业至少要几十秒,会造成消息积压告警,有没有可能先启新作业待运行平稳后再停止老作业?kafka
> &gt; group使用同一个,作业启动从group-offsets开始可以吗?另外,如果是有大状态作业又要如何无缝升级?

回复: flink sql作业无缝升级问题

Posted by 刘超 <li...@foxmail.com>.
kafka group使用同一个,作业启动从group-offsets开始,如果没有状态的作业是可以的,但是如果存在状态的话,可能不太行。
最好的办法就是等流量下来后,再进行一个切换&nbsp;




刘超
liuchao1019@foxmail.com



&nbsp;




------------------&nbsp;原始邮件&nbsp;------------------
发件人:                                                                                                                        "user-zh"                                                                                    <liujiangangpeng@gmail.com&gt;;
发送时间:&nbsp;2022年11月30日(星期三) 晚上8:08
收件人:&nbsp;"user-zh"<user-zh@flink.apache.org&gt;;

主题:&nbsp;Re: flink sql作业无缝升级问题



Flink目前无法做到无缝升级,需要走stop-with-savepoint、start
job的流程,但是在这之间可以做一些优化来缩短恢复时间。比如,把新作业先启动起来,申请好资源,同时停掉老作业,将做好的savepoint用来触发新作业的执行。

casel.chen <casel_chan@126.com&gt; 于2022年11月29日周二 08:38写道:

&gt; 线上有一个流量较大的flink sql作业需要升级添加业务字段,当前主要是kafka (canal) 多表关联写入 mongodb
&gt; 数据同步场景,除了source offset外无其他状态,如何让用户对升级无感呢?
&gt; 常规的停止作业再启动作业至少要几十秒,会造成消息积压告警,有没有可能先启新作业待运行平稳后再停止老作业?kafka
&gt; group使用同一个,作业启动从group-offsets开始可以吗?另外,如果是有大状态作业又要如何无缝升级?

Re: Re: flink sql作业无缝升级问题

Posted by yidan zhao <hi...@gmail.com>.
通过savepoint方式先停止作业可以,不停止,你要考虑是否你的作业是否能做到重复处理部分数据不影响准确性。

先做savepoint但不停止作业,新作业启动后,新旧作业是消费的数据是重复的,不会因为相同group就不重复。
因为kafka的消费是2个模式,一个是组模式,还有一个是不受到组约束的。Flink采用的是后者。

我说的那个方法是在kafka后边加一个filter,filter的参数就是start和end,根据start和end过滤数据。
而且这个start和end需要可动态配置,就是不重启作业能配置才行。
这样就可以先启动新作业,并设置其从未来某个时间点(ts)开始消费,并设置旧作业消费到ts后停止。这样等待到ts到达,并确认旧任务消费完成ts之前的数据,停止旧作业就好了。

casel.chen <ca...@126.com> 于2022年12月2日周五 12:42写道:
>
>
>
>
>
>
>
> 拿kafka source作业为例,新老作业使用相同的consumer group,老作业先做savepoint,完了在老作业还在运行的同时启动新作业从刚才的savepoint恢复会有问题么?
> 如何设置一个流量开关让新作业“准备”好再打开流量呢?有没有具体实操的例子?还是说需要自己修改flink源码,具体要看哪一个类方法?
>
>
>
>
>
>
>
>
>
>
>
> 在 2022-11-30 20:08:44,"Jiangang Liu" <li...@gmail.com> 写道:
> >Flink目前无法做到无缝升级,需要走stop-with-savepoint、start
> >job的流程,但是在这之间可以做一些优化来缩短恢复时间。比如,把新作业先启动起来,申请好资源,同时停掉老作业,将做好的savepoint用来触发新作业的执行。
> >
> >casel.chen <ca...@126.com> 于2022年11月29日周二 08:38写道:
> >
> >> 线上有一个流量较大的flink sql作业需要升级添加业务字段,当前主要是kafka (canal) 多表关联写入 mongodb
> >> 数据同步场景,除了source offset外无其他状态,如何让用户对升级无感呢?
> >> 常规的停止作业再启动作业至少要几十秒,会造成消息积压告警,有没有可能先启新作业待运行平稳后再停止老作业?kafka
> >> group使用同一个,作业启动从group-offsets开始可以吗?另外,如果是有大状态作业又要如何无缝升级?

Re:Re: flink sql作业无缝升级问题

Posted by "casel.chen" <ca...@126.com>.





拿kafka source作业为例,新老作业使用相同的consumer group,老作业先做savepoint,完了在老作业还在运行的同时启动新作业从刚才的savepoint恢复会有问题么?
如何设置一个流量开关让新作业“准备”好再打开流量呢?有没有具体实操的例子?还是说需要自己修改flink源码,具体要看哪一个类方法?











在 2022-11-30 20:08:44,"Jiangang Liu" <li...@gmail.com> 写道:
>Flink目前无法做到无缝升级,需要走stop-with-savepoint、start
>job的流程,但是在这之间可以做一些优化来缩短恢复时间。比如,把新作业先启动起来,申请好资源,同时停掉老作业,将做好的savepoint用来触发新作业的执行。
>
>casel.chen <ca...@126.com> 于2022年11月29日周二 08:38写道:
>
>> 线上有一个流量较大的flink sql作业需要升级添加业务字段,当前主要是kafka (canal) 多表关联写入 mongodb
>> 数据同步场景,除了source offset外无其他状态,如何让用户对升级无感呢?
>> 常规的停止作业再启动作业至少要几十秒,会造成消息积压告警,有没有可能先启新作业待运行平稳后再停止老作业?kafka
>> group使用同一个,作业启动从group-offsets开始可以吗?另外,如果是有大状态作业又要如何无缝升级?

Re: flink sql作业无缝升级问题

Posted by Jiangang Liu <li...@gmail.com>.
Flink目前无法做到无缝升级,需要走stop-with-savepoint、start
job的流程,但是在这之间可以做一些优化来缩短恢复时间。比如,把新作业先启动起来,申请好资源,同时停掉老作业,将做好的savepoint用来触发新作业的执行。

casel.chen <ca...@126.com> 于2022年11月29日周二 08:38写道:

> 线上有一个流量较大的flink sql作业需要升级添加业务字段,当前主要是kafka (canal) 多表关联写入 mongodb
> 数据同步场景,除了source offset外无其他状态,如何让用户对升级无感呢?
> 常规的停止作业再启动作业至少要几十秒,会造成消息积压告警,有没有可能先启新作业待运行平稳后再停止老作业?kafka
> group使用同一个,作业启动从group-offsets开始可以吗?另外,如果是有大状态作业又要如何无缝升级?