当前位置: 首页 > 知识库问答 >
问题:

在相同的字段上Flink键是否会导致一次洗牌?

倪培
2023-03-14
dataStream.map(func1).keyBy("key") //(1)
  .process(func2).keyBy("key")     //(2)
  .timeWindow().aggregate(func3).addSink(sink)

方法process()不更改记录的字段(键)值。假设所有算子的并行度都是2,那么keyBy()at(2)是否也会导致网络洗牌呢?也许keyBy()at(2)由于密钥值不变而具有前向策略避免网络通信代价的效果?

太好了~

共有1个答案

洪楷
2023-03-14

keyBy总是很昂贵的,因为它强制记录通过ser/de。但是在通信是本地的情况下(即在同一个任务槽内),Flink将使用共享缓冲区来通信串行化的字节,而不是通过整个netty tcp堆栈。所以是的,在您的情况下,第二个键比第一个键便宜。但我不会说代价很小。

如果您知道keyBy是完全不需要的,那么您可以使用reinterpretAsKeyedStream再次返回keyedStream而没有任何开销。

 类似资料:
  • 当我在嵌套字段上使用JsonUnwrapped时: 同时我使用: 父类为嵌套类。 我得到了错误: 但是,当我删除时,该字段会反序列化,但在序列化期间不会变平。 编辑: 我粘贴完整代码: 以下主要方法失败: 有错误: 线程maincom.fasterxml.jackson.databind.exc.的异常:无法构造的实例(没有Creator,如默认构造,存在):无法从Object值反序列化(没有基于

  • 这只是出于好奇。 如果是这样,那么扩展到一个极端的情况,如果您的内存以某种方式结束了超级碎片(例如,每隔一个字节都被分配为ala 我想站台不重要? 很抱歉提出了一个扩展的问题,但这也会发生在其他语言中吗,比如Java/C#?

  • 我有一个算法,在一些不同的字符串之间给我一个分数。我的想法是:如果两个字符串之间的分数高于0'80,那么这两个字符串将被认为是相同的,当我应用keyby(“name”)时,那些相似的字符串将被键入,因为它们具有完全相同的名称。 直观示例: DataStream1-----约翰·洛克,米奇·米克,威尔·威廉姆斯 希望你能理解,谢谢!

  • 我试图实现一个函数,我使用实现了它,该函数运行良好,但用于并行化。我正在将函数转换为可拆分的Do函数。我使用在本地运行了一个包含5000个元素的单元测试,而在DataFlow中运行了相同的单元测试,但失败了,错误如下。 下面给出了本地DirectRunner和云数据流运行器之间的数据差异。 本地中的DirectRunner: 在示例输入PCollection元素中有5000个ABC 云中的Data