Flink keyby key 数量多的情况下使用对不对?

Is it correct to use Flink keyby with a large number of keys?

如果有1000万个订单,20万以上商户。现在我需要统计每个商家的订单数量,所以我使用下面的方法(见代码)。这个对吗?因为key会很多,不知道Flink会不会对里面的每个key进行维度标注,会不会导致OOM?

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

在这种情况下,Flink 将维护一个 Integer 值作为托管的键控状态。因此,一旦看到每个商家的一个或多个订单,Flink 的状态后端将拥有 200,000 多个商家中每个商家的数据。

Flink 的可扩展性很强,key 多了也不是问题。 keyBy 对流进行分区,以便每个任务管理器(工作人员)将只处理键子集的事件。 (这是一个分片 key/value 存储。)此外,您可以选择将此状态保存在内存中的基于堆的状态后端,或在每个任务管理器上使用嵌入式 RocksDB 实例的后端,以保持状态每个任务管理器的本地磁盘。

底线:200000 个整数不是很多状态。不用担心,即使只有一个任务管理器。