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