开发者社区> 问答> 正文

Flink DataStream 针对数据重新分区的疑惑?

举例说明:

系统规定用户只要点赞两次,就奖励5块钱
一个用户连续点了两次,被放在kafka不同的partition中,flink消费的时候,同时消费计算,都只记录该用户点赞一次,都不发奖励,但实际如果这两条数据单线程计算,应该发放奖励。(极端状况)

问题说明:
有这样一种需求,例如flink的map操作中,并行度为3,需要保证从kafka过来的数据,同一个用户的数据单线程计算,不同用户的数据可以多线程计算。
DataStream没有group这个概念,必须使用窗口函数来解决问题吗?但是我并不需要窗口统计的功能,只是为了保证kafka进入的一批数据中,同一个用户的数据在同一个数据分区中,就可以了
请问有没有比较好的解决思路?谢谢!

展开
收起
龙火火 2018-10-24 17:20:19 5187 0
2 条回答
写回答
取消 提交回答
  • 这个问题应该是采用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的含义,可以看看这个

    2019-07-17 23:10:03
    赞同 展开评论 打赏
  • 鲁尼:先keyby一下

    问: keyby 如果 数据延迟 一条过来 一条还没到 还是会有问题吧?
    我觉的可以 根据 用户的ID做hash 同一个用户的数据一定在一个分区
    保证 数据进入kafka 和出kafka是有顺序一致

    鲁尼:这就需要看你的具体需求了,业务上定义一下能容忍的延迟是多少
    或者你不care两次点赞的间隔的话,你就简单的用一个value state记录用户点赞了多少次,大于等于第二次那下发出奖励,以后就不发了

    问:延迟没关系,每一次点赞完成后,会在redis保存一个数据(value是list的),然后再判断list的size是否大于2,主要是不希望同一个用户的操作多线程处理

    鲁尼:那就keyby用户,用value state,也不用redis了,就可以了

    2019-07-17 23:10:03
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Flink CDC Meetup PPT - 龚中强 立即下载
Flink CDC Meetup PPT - 王赫 立即下载
Flink CDC Meetup PPT - 覃立辉 立即下载