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 个整数不是很多状态。不用担心,即使只有一个任务管理器。
如果有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 个整数不是很多状态。不用担心,即使只有一个任务管理器。