Flink 在 distinct() 中使用了什么魔法?代理键是如何生成的?

What magics does Flink use in distinct()? How are surrogate keys generated?

关于生成代理键,第一步是获取不同的,然后为每个元组构建一个增量键。

所以我使用 Java Set 来获取不同的元素并且它超出了堆 space。 然后,我使用 Flink 的 distinct() 并且它完全有效。

请问是什么造成了这种差异?

另外一个相关的问题是,Flink可以在mapper中生成surrogate key吗?

Flink 在内部执行 distinct() 作为 GroupBy 后跟 ReduceGroup 运算符,其中 reduce 运算符 returns 仅是组的第一个元素。

GroupBy是通过对数据进行排序完成的。排序是在二进制数据表示上完成的,如果可能的话在内存中,但如果没有足够的内存可用,则可能会溢出到磁盘。 blog post 对此提供了一些见解。 GroupBySort 在 Flink 中是内存安全的,不会因 OutOfMemoryError.

而失败

您还可以使用 DataSet.distinct(KeySelector ks) 对自定义键进行区分。密钥选择器基本上是一个生成自定义密钥的 MapFunction