Apache flink 如何跨州划分数据

Apache flink 如何跨州划分数据,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我在一本书中读到 Flink为每个keyvalue维护一个状态实例,并将具有相同密钥的所有记录分区到 维护此密钥状态的操作员任务 我的问题是: 假设我有4个任务,每个任务有2个插槽。 还有一个密钥属于95%的数据 这是否意味着95%的数据被路由到同一台机器?是的,这确实意味着。如果您有一个热键,那么按键分区就不能很好地扩展 在某些情况下,有办法绕过这一限制。例如,如果您正在计算分析(例如,您想计算每页每分钟的页面浏览量,一页获得95%的页面浏览量),您可以进行预聚合——将热键的工作拆分到多个并行

我在一本书中读到

Flink为每个keyvalue维护一个状态实例,并将具有相同密钥的所有记录分区到

维护此密钥状态的操作员任务

我的问题是:

假设我有4个任务,每个任务有2个插槽。 还有一个密钥属于95%的数据


这是否意味着95%的数据被路由到同一台机器?

是的,这确实意味着。如果您有一个热键,那么按键分区就不能很好地扩展

在某些情况下,有办法绕过这一限制。例如,如果您正在计算分析(例如,您想计算每页每分钟的页面浏览量,一页获得95%的页面浏览量),您可以进行预聚合——将热键的工作拆分到多个并行实例中,然后对部分结果进行最后的非并行缩减。(这只是标准的map/reduce逻辑。)

这被称为“数据倾斜”,它是各地可扩展应用程序的祸根

也有可能整个(100%)负载都流向同一台机器。不能保证数据通过密钥尽可能均匀地分布,只能保证每个密钥在一台机器上进行处理。从技术上讲,每个密钥映射到一个密钥组(密钥组的数量是拓扑的最大并行度),每个密钥组由特定的操作符实例处理


处理这种情况的一种方法是向键添加第二个字段,从而产生更多可能的键,并可能减少键之间的数据倾斜。然后,只使用一个原始键将结果聚合到后续运算符中。

有什么不同的处理方法吗?我已经对答案进行了一些扩展。