Flink适合keyby大量的key吗?

场景:
如果有1000万订单,和20万以上的商家。现在我需要计算每个商家的订单数量,所以我使用以下方法(见代码)。这是正确的吗?因为会有很多键,我不知道Flink是否会对里面的每个键进行尺寸标注,是否会导致OOM?

//商家 merchantId
orderStream.keyby(merchantId)
           .reduce(new ReduceFunction<Integer>() {
             @Override
              public Integer reduce(Integer value1, Integer value2)
               throws Exception {
                return value1 + value2;
            }
           });

在这种情况下,Flink将维护一个Integer值作为托管的键控状态。因此,一旦看到每个商家的一个或多个订单,Flink的状态后端将拥有20多万家商家的数据。
Flink具有高度的可伸缩性,因此拥有大量的键并不是问题。keyBy对流进行分区,这样每个任务管理器(worker)将只处理键的一个子集的事件。(这是一个分片的键/值存储。)此外,你可以选择一个基于堆的状态后端,将状态保存在内存中,或者在每个任务管理器上使用一个嵌入式RocksDB实例,将状态保存在每个任务管理器的本地磁盘上。
底线:200000个整数不是很状态。不用担心,即使只有一个任务管理器。
所以答案是可以的,上述问答是翻译自https://stackoverflow.com/questions/65609392/is-it-correct-to-use-flink-keyby-with-a-large-number-of-keys,供大家参考;

描述下我们具体实践的场景:

  1. 我们是在建设数仓模型dws聚合层的时候,做了keyby 维度+事件时间(分钟)+基于processtime开窗计算pv这样的计算逻辑;
  2. 因为是曝光,我们的聚合后的数据量级在1000w/min,与此同时我们的服务器配置如下:
    topic 是160Partition2Replica,kafka带宽20M/S;flink job资源160C/700G;checkpoint 1min一次; backend FsStateBackend;
  3. 平时正常流量checkpoint情况:耗时2s钟,state size 2MB左右,Buffered During Alignment 0B;
  4. 活动流量高峰时checkpoint情况:最高耗时1m 36s,state size 30 GB左右,Buffered During Alignment 1.04 GB;
  5. 在这时交代下我们是开启kafka事务的,端到端精准一次生产消费;
  6. 我们在压测的时候遇到过如下问题:
    a) sink算子导致反压,我们进行了写入topic分区的增加;
    b)内存使用率过高,甚至出现过oom,进行过cpu/memory配比的调整 从1:2调整到1:4;
    c)生产端限速,导致checkpoint,写入速度慢,反压,甚至是checkpoint失败。我们进行了 生产提速;参考我的另外一个文章:https://blog.csdn.net/qq_31451711/article/details/122672955

由于我们开启事务以及开窗的原因,在数据积压时,会呈现梯形状递增;
还请各位大佬多多指教!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值