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 对此提供了一些见解。 GroupBy
和 Sort
在 Flink 中是内存安全的,不会因 OutOfMemoryError
.
而失败
您还可以使用 DataSet.distinct(KeySelector ks)
对自定义键进行区分。密钥选择器基本上是一个生成自定义密钥的 MapFunction
。
关于生成代理键,第一步是获取不同的,然后为每个元组构建一个增量键。
所以我使用 Java Set 来获取不同的元素并且它超出了堆 space。 然后,我使用 Flink 的 distinct() 并且它完全有效。
请问是什么造成了这种差异?
另外一个相关的问题是,Flink可以在mapper中生成surrogate key吗?
Flink 在内部执行 distinct()
作为 GroupBy
后跟 ReduceGroup
运算符,其中 reduce 运算符 returns 仅是组的第一个元素。
GroupBy
是通过对数据进行排序完成的。排序是在二进制数据表示上完成的,如果可能的话在内存中,但如果没有足够的内存可用,则可能会溢出到磁盘。 blog post 对此提供了一些见解。 GroupBy
和 Sort
在 Flink 中是内存安全的,不会因 OutOfMemoryError
.
您还可以使用 DataSet.distinct(KeySelector ks)
对自定义键进行区分。密钥选择器基本上是一个生成自定义密钥的 MapFunction
。