回复:消费kafka数据乱序问题

classic Classic list List threaded Threaded
5 messages Options
smq
Reply | Threaded
Open this post in threaded view
|

回复:消费kafka数据乱序问题

smq
换句话说,写进kafka的数据是同一个用户的两条,余额分别是0和100,就是我之前那个计算过程,这个计算操作在Oracle完成,我只负责把余额,也就是0或者100更新到kudu对应的余额字段,因为消费数据可能会乱序,先更新100,再更新0,这样导致存在kudu的数据是0,正确的数据最终应该是100

---原始邮件---
发件人: "wwj"<[hidden email]&gt;
发送时间: 2020年9月4日(周五) 下午5:10
收件人: "smq"<[hidden email]&gt;;
主题: 回复:消费kafka数据乱序问题



“假如说先处理了存钱,存上之后余额是100-100+100=100”&nbsp; 这句话没看懂,存上之后余额不应该是 100+100=200 吗?








原始邮件


发件人:"smq"< [hidden email] &gt;;

发件时间:2020/9/4 16:40

收件人:"user-zh"< [hidden email] &gt;;

主题:消费kafka数据乱序问题



大家好
&nbsp; &nbsp;现在碰到一个关于处理乱序的问题,业务场景是银行余额的更新,数据源是kafka,有一个账户余额字段,sink到kudu,更新客户余额.
如果对于同一个账户的多笔操作出现乱序,可能会导致客户余额不对。比如一个客户账户有100块,先消费100,然后存100,按照正常的数据处理顺序,帐户余额应该还是100的,假如说先处理了存钱,存上之后余额是100-100+100=100,然后处理消费100的那条数据,由于消费在前,这时这条数据对应的余额是100-100=0。
&nbsp; 这样的话就出现了统计余额错误,请问想要按照事件时间处理数据是不是可以先keyby,然后用watermark.
Reply | Threaded
Open this post in threaded view
|

回复:消费kafka数据乱序问题

宁吉浩
我也遇到了和你一样的问题,也是两条数据有因果关系,必须有严格的先后顺序,我这边的业务不像银行那么严格;
我的解决办法是把迟到数据丢弃,然后进行业务计算;
另起一个程序把数据缓存在内存里,对数据排序,然后再度修正计算;
之前的实时+离线数仓用的办法,代码开发一次,但还要跑两次;


------------------------------------------------------------------
发件人:smq <[hidden email]>
发送时间:2020年9月4日(星期五) 17:35
收件人:wwj <[hidden email]>; user-zh <[hidden email]>
主 题:回复:消费kafka数据乱序问题

换句话说,写进kafka的数据是同一个用户的两条,余额分别是0和100,就是我之前那个计算过程,这个计算操作在Oracle完成,我只负责把余额,也就是0或者100更新到kudu对应的余额字段,因为消费数据可能会乱序,先更新100,再更新0,这样导致存在kudu的数据是0,正确的数据最终应该是100

---原始邮件---
发件人: "wwj"<[hidden email]&gt;
发送时间: 2020年9月4日(周五) 下午5:10
收件人: "smq"<[hidden email]&gt;;
主题: 回复:消费kafka数据乱序问题



“假如说先处理了存钱,存上之后余额是100-100+100=100”&nbsp; 这句话没看懂,存上之后余额不应该是 100+100=200 吗?








原始邮件


发件人:"smq"< [hidden email] &gt;;

发件时间:2020/9/4 16:40

收件人:"user-zh"< [hidden email] &gt;;

主题:消费kafka数据乱序问题



大家好
&nbsp; &nbsp;现在碰到一个关于处理乱序的问题,业务场景是银行余额的更新,数据源是kafka,有一个账户余额字段,sink到kudu,更新客户余额.
如果对于同一个账户的多笔操作出现乱序,可能会导致客户余额不对。比如一个客户账户有100块,先消费100,然后存100,按照正常的数据处理顺序,帐户余额应该还是100的,假如说先处理了存钱,存上之后余额是100-100+100=100,然后处理消费100的那条数据,由于消费在前,这时这条数据对应的余额是100-100=0。
&nbsp; 这样的话就出现了统计余额错误,请问想要按照事件时间处理数据是不是可以先keyby,然后用watermark.
Reply | Threaded
Open this post in threaded view
|

Re: 消费kafka数据乱序问题

Xiao Xu
两个方法
1. kafka 里面可以 keyby, partition 里面都是有序的, 所以每个用户处理都是有序的
2. 就是你说的在 flink 里面做乱序处理

宁吉浩 <[hidden email]> 于2020年9月4日周五 下午5:56写道:

> 我也遇到了和你一样的问题,也是两条数据有因果关系,必须有严格的先后顺序,我这边的业务不像银行那么严格;
> 我的解决办法是把迟到数据丢弃,然后进行业务计算;
> 另起一个程序把数据缓存在内存里,对数据排序,然后再度修正计算;
> 之前的实时+离线数仓用的办法,代码开发一次,但还要跑两次;
>
>
> ------------------------------------------------------------------
> 发件人:smq <[hidden email]>
> 发送时间:2020年9月4日(星期五) 17:35
> 收件人:wwj <[hidden email]>; user-zh <[hidden email]>
> 主 题:回复:消费kafka数据乱序问题
>
>
> 换句话说,写进kafka的数据是同一个用户的两条,余额分别是0和100,就是我之前那个计算过程,这个计算操作在Oracle完成,我只负责把余额,也就是0或者100更新到kudu对应的余额字段,因为消费数据可能会乱序,先更新100,再更新0,这样导致存在kudu的数据是0,正确的数据最终应该是100
>
> ---原始邮件---
> 发件人: "wwj"<[hidden email]&gt;
> 发送时间: 2020年9月4日(周五) 下午5:10
> 收件人: "smq"<[hidden email]&gt;;
> 主题: 回复:消费kafka数据乱序问题
>
>
>
> “假如说先处理了存钱,存上之后余额是100-100+100=100”&nbsp; 这句话没看懂,存上之后余额不应该是 100+100=200 吗?
>
>
>
>
>
>
>
>
> 原始邮件
>
>
> 发件人:"smq"< [hidden email] &gt;;
>
> 发件时间:2020/9/4 16:40
>
> 收件人:"user-zh"< [hidden email] &gt;;
>
> 主题:消费kafka数据乱序问题
>
>
>
> 大家好
> &nbsp;
> &nbsp;现在碰到一个关于处理乱序的问题,业务场景是银行余额的更新,数据源是kafka,有一个账户余额字段,sink到kudu,更新客户余额.
>
> 如果对于同一个账户的多笔操作出现乱序,可能会导致客户余额不对。比如一个客户账户有100块,先消费100,然后存100,按照正常的数据处理顺序,帐户余额应该还是100的,假如说先处理了存钱,存上之后余额是100-100+100=100,然后处理消费100的那条数据,由于消费在前,这时这条数据对应的余额是100-100=0。
> &nbsp; 这样的话就出现了统计余额错误,请问想要按照事件时间处理数据是不是可以先keyby,然后用watermark.
Reply | Threaded
Open this post in threaded view
|

回复: 消费kafka数据乱序问题

忝忝向仧
这里有点不明白,假设源端是消费100,那么记录会是0,然后存100结果是变回100
两条记录同步过来就是0,100,那么根据主键取时间最最新一条记录(也就是100那条)是否就行了?






------------------&nbsp;原始邮件&nbsp;------------------
发件人:                                                                                                                        "user-zh"                                                                                    <[hidden email]&gt;;
发送时间:&nbsp;2020年9月4日(星期五) 晚上6:59
收件人:&nbsp;"user-zh"<[hidden email]&gt;;"宁吉浩"<[hidden email]&gt;;

主题:&nbsp;Re: 消费kafka数据乱序问题



两个方法
1. kafka 里面可以 keyby, partition 里面都是有序的, 所以每个用户处理都是有序的
2. 就是你说的在 flink 里面做乱序处理

宁吉浩 <[hidden email]&gt; 于2020年9月4日周五 下午5:56写道:

&gt; 我也遇到了和你一样的问题,也是两条数据有因果关系,必须有严格的先后顺序,我这边的业务不像银行那么严格;
&gt; 我的解决办法是把迟到数据丢弃,然后进行业务计算;
&gt; 另起一个程序把数据缓存在内存里,对数据排序,然后再度修正计算;
&gt; 之前的实时+离线数仓用的办法,代码开发一次,但还要跑两次;
&gt;
&gt;
&gt; ------------------------------------------------------------------
&gt; 发件人:smq <[hidden email]&gt;
&gt; 发送时间:2020年9月4日(星期五) 17:35
&gt; 收件人:wwj <[hidden email]&gt;; user-zh <[hidden email]&gt;
&gt; 主 题:回复:消费kafka数据乱序问题
&gt;
&gt;
&gt; 换句话说,写进kafka的数据是同一个用户的两条,余额分别是0和100,就是我之前那个计算过程,这个计算操作在Oracle完成,我只负责把余额,也就是0或者100更新到kudu对应的余额字段,因为消费数据可能会乱序,先更新100,再更新0,这样导致存在kudu的数据是0,正确的数据最终应该是100
&gt;
&gt; ---原始邮件---
&gt; 发件人: "wwj"<[hidden email]&amp;gt;
&gt; 发送时间: 2020年9月4日(周五) 下午5:10
&gt; 收件人: "smq"<[hidden email]&amp;gt;;
&gt; 主题: 回复:消费kafka数据乱序问题
&gt;
&gt;
&gt;
&gt; “假如说先处理了存钱,存上之后余额是100-100+100=100”&amp;nbsp; 这句话没看懂,存上之后余额不应该是 100+100=200 吗?
&gt;
&gt;
&gt;
&gt;
&gt;
&gt;
&gt;
&gt;
&gt; 原始邮件
&gt;
&gt;
&gt; 发件人:"smq"< [hidden email] &amp;gt;;
&gt;
&gt; 发件时间:2020/9/4 16:40
&gt;
&gt; 收件人:"user-zh"< [hidden email] &amp;gt;;
&gt;
&gt; 主题:消费kafka数据乱序问题
&gt;
&gt;
&gt;
&gt; 大家好
&gt; &amp;nbsp;
&gt; &amp;nbsp;现在碰到一个关于处理乱序的问题,业务场景是银行余额的更新,数据源是kafka,有一个账户余额字段,sink到kudu,更新客户余额.
&gt;
&gt; 如果对于同一个账户的多笔操作出现乱序,可能会导致客户余额不对。比如一个客户账户有100块,先消费100,然后存100,按照正常的数据处理顺序,帐户余额应该还是100的,假如说先处理了存钱,存上之后余额是100-100+100=100,然后处理消费100的那条数据,由于消费在前,这时这条数据对应的余额是100-100=0。
&gt; &amp;nbsp; 这样的话就出现了统计余额错误,请问想要按照事件时间处理数据是不是可以先keyby,然后用watermark.
Reply | Threaded
Open this post in threaded view
|

Re: 消费kafka数据乱序问题

china_tao
In reply to this post by Xiao Xu
业务端根据用户ID
hash发送到kafka,保证每一个用户的所有操作在kafka的同一个partition内,并且在发送端保证操作有序。

至于flink消费kafka后,乱序,不太可能,或者说可能性极小,毕竟都是按照offset来消费。

在 2020/9/4 18:59, Xiao Xu 写道:

> 两个方法
> 1. kafka 里面可以 keyby, partition 里面都是有序的, 所以每个用户处理都是有序的
> 2. 就是你说的在 flink 里面做乱序处理
>
> 宁吉浩 <[hidden email]> 于2020年9月4日周五 下午5:56写道:
>
>> 我也遇到了和你一样的问题,也是两条数据有因果关系,必须有严格的先后顺序,我这边的业务不像银行那么严格;
>> 我的解决办法是把迟到数据丢弃,然后进行业务计算;
>> 另起一个程序把数据缓存在内存里,对数据排序,然后再度修正计算;
>> 之前的实时+离线数仓用的办法,代码开发一次,但还要跑两次;
>>
>>
>> ------------------------------------------------------------------
>> 发件人:smq <[hidden email]>
>> 发送时间:2020年9月4日(星期五) 17:35
>> 收件人:wwj <[hidden email]>; user-zh <[hidden email]>
>> 主 题:回复:消费kafka数据乱序问题
>>
>>
>> 换句话说,写进kafka的数据是同一个用户的两条,余额分别是0和100,就是我之前那个计算过程,这个计算操作在Oracle完成,我只负责把余额,也就是0或者100更新到kudu对应的余额字段,因为消费数据可能会乱序,先更新100,再更新0,这样导致存在kudu的数据是0,正确的数据最终应该是100
>>
>> ---原始邮件---
>> 发件人: "wwj"<[hidden email]&gt;
>> 发送时间: 2020年9月4日(周五) 下午5:10
>> 收件人: "smq"<[hidden email]&gt;;
>> 主题: 回复:消费kafka数据乱序问题
>>
>>
>>
>> “假如说先处理了存钱,存上之后余额是100-100+100=100”&nbsp; 这句话没看懂,存上之后余额不应该是 100+100=200 吗?
>>
>>
>>
>>
>>
>>
>>
>>
>> 原始邮件
>>
>>
>> 发件人:"smq"< [hidden email] &gt;;
>>
>> 发件时间:2020/9/4 16:40
>>
>> 收件人:"user-zh"< [hidden email] &gt;;
>>
>> 主题:消费kafka数据乱序问题
>>
>>
>>
>> 大家好
>> &nbsp;
>> &nbsp;现在碰到一个关于处理乱序的问题,业务场景是银行余额的更新,数据源是kafka,有一个账户余额字段,sink到kudu,更新客户余额.
>>
>> 如果对于同一个账户的多笔操作出现乱序,可能会导致客户余额不对。比如一个客户账户有100块,先消费100,然后存100,按照正常的数据处理顺序,帐户余额应该还是100的,假如说先处理了存钱,存上之后余额是100-100+100=100,然后处理消费100的那条数据,由于消费在前,这时这条数据对应的余额是100-100=0。
>> &nbsp; 这样的话就出现了统计余额错误,请问想要按照事件时间处理数据是不是可以先keyby,然后用watermark.