Apache flink 为什么键控流(在keyBy上)会创建倾斜的下游执行?

Apache flink 为什么键控流(在keyBy上)会创建倾斜的下游执行?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一个例子,其中有8个键(在一个键槽上),插槽上的排列是倾斜的。我的并行度是3,键控操作的分布是5,2和1,在一个插槽上有5个键。是否有办法确保键控操作的分布平衡。(我们在键控流上没有分区操作)keyBy()假设均匀分布。一般来说,这个问题可以通过实现一个人工密钥来解决 在内部,Flink在您的密钥上调用obj.hashCode(),并用它(以及一些附加逻辑)分发您的记录。您可以实现自己的钥匙选择器,它可以包裹螺纹钥匙并实现更好的hashCode()方法。keyBy()采用均匀分布。一般来说,

我有一个例子,其中有8个键(在一个键槽上),插槽上的排列是倾斜的。我的并行度是3,键控操作的分布是5,2和1,在一个插槽上有5个键。是否有办法确保键控操作的分布平衡。(我们在键控流上没有分区操作)

keyBy()
假设均匀分布。一般来说,这个问题可以通过实现一个人工密钥来解决

在内部,Flink在您的密钥上调用
obj.hashCode()
,并用它(以及一些附加逻辑)分发您的记录。您可以实现自己的
钥匙选择器
,它可以包裹螺纹钥匙并实现更好的
hashCode()
方法。

keyBy()
采用均匀分布。一般来说,这个问题可以通过实现一个人工密钥来解决


在内部,Flink在您的密钥上调用
obj.hashCode()
,并用它(以及一些附加逻辑)分发您的记录。您可以实现自己的
键选择器
,它可以包裹螺纹键,并实现更好的
hashCode()
方法。

“螺纹”键?钥匙没有歪斜。keyBy()的输出是8个不同的键控流,其中有8个完全不同的键,它们在插槽上以非均匀方式入射。我认为我们在分区和分组方面都依赖于obj.hashCode(),这是一个不可避免的问题。obj.hashCode()%n可以相等,即使obj(在我的例子中是一个字符串)不同,并且n是常量(并行度?)对不起,可能我没有理解您的问题。你熟悉Flink中关键群体的概念吗?键根据您在程序中定义的最大并行度进行分组。如果此运算符的最大平行度设置为3,则可能会解决您的问题。另请参见此处的“拧紧”键?钥匙没有歪斜。keyBy()的输出是8个不同的键控流,其中有8个完全不同的键,它们在插槽上以非均匀方式入射。我认为我们在分区和分组方面都依赖于obj.hashCode(),这是一个不可避免的问题。obj.hashCode()%n可以相等,即使obj(在我的例子中是一个字符串)不同,并且n是常量(并行度?)对不起,可能我没有理解您的问题。你熟悉Flink中关键群体的概念吗?键根据您在程序中定义的最大并行度进行分组。如果此运算符的最大并行度设置为3,则可能会解决您的问题。另请参见此处: