举例说明:
系统规定用户只要点赞两次,就奖励5块钱
一个用户连续点了两次,被放在kafka不同的partition中,flink消费的时候,同时消费计算,都只记录该用户点赞一次,都不发奖励,但实际如果这两条数据单线程计算,应该发放奖励。(极端状况)
问题说明:
有这样一种需求,例如flink的map操作中,并行度为3,需要保证从kafka过来的数据,同一个用户的数据单线程计算,不同用户的数据可以多线程计算。
DataStream没有group这个概念,必须使用窗口函数来解决问题吗?但是我并不需要窗口统计的功能,只是为了保证kafka进入的一批数据中,同一个用户的数据在同一个数据分区中,就可以了
请问有没有比较好的解决思路?谢谢!
这个问题应该是采用keyby来实现分区,之前使用keyby之后,会生成 KeyedStream< XXX , Tuple > ,不理解Tuple是干啥用的,之前使用spark 进行group之后,应该是这样的结构( < key , List >),这个tuple,让我很蒙圈,以为只能使用在其后面使用聚合类的算子,但是后来实验了一下,可以进行map,并且map的时候tuple不会出现,虽然还是不懂为啥会有个tuple出现,但是能满足业务需求了。后续搞懂了,再来分享,如果有大神理解的比较深刻,也请多多赐教!
public class WC {
public String word;
public int count;
}
DataStream words = // [...]
DataStream wordCounts = words.keyBy("word").window(/window specification/);
对于不是很明白keyby参数word的含义,可以看看这个
鲁尼:先keyby一下
问: keyby 如果 数据延迟 一条过来 一条还没到 还是会有问题吧?
我觉的可以 根据 用户的ID做hash 同一个用户的数据一定在一个分区
保证 数据进入kafka 和出kafka是有顺序一致
鲁尼:这就需要看你的具体需求了,业务上定义一下能容忍的延迟是多少
或者你不care两次点赞的间隔的话,你就简单的用一个value state记录用户点赞了多少次,大于等于第二次那下发出奖励,以后就不发了
问:延迟没关系,每一次点赞完成后,会在redis保存一个数据(value是list的),然后再判断list的size是否大于2,主要是不希望同一个用户的操作多线程处理
鲁尼:那就keyby用户,用value state,也不用redis了,就可以了
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。