Java Flinks Collector.collect()如何处理数据?

Java Flinks Collector.collect()如何处理数据?,java,apache-flink,flink-batch,Java,Apache Flink,Flink Batch,我试图了解Flinks Collector.collect()的功能以及它如何处理传入/传出数据: 来自Flink数据集API的示例: 以下代码将文本行数据集转换为单词数据集: DataSet<String> output = input.flatMap(new Tokenizer()); public class Tokenizer implements FlatMapFunction<String, String> { @Override public v

我试图了解Flinks Collector.collect()的功能以及它如何处理传入/传出数据:

来自Flink数据集API的示例:

以下代码将文本行数据集转换为单词数据集:


DataSet<String> output = input.flatMap(new Tokenizer());

public class Tokenizer implements FlatMapFunction<String, String> {
  @Override
  public void flatMap(String value, Collector<String> out) {
    for (String token : value.split("\\W")) {
      out.collect(token);
    }
  }
}

数据集输出=input.flatMap(新标记器());
公共类标记器实现FlatMapFunction{
@凌驾
公共void平面图(字符串值,收集器输出){
用于(字符串标记:value.split(\\W”)){
提取(代币);
}
}
}
因此,文本行被拆分为标记,每个标记都被“收集”。听起来很直观,但我缺少Collector.collect()背后的实际动态。收集到的数据在分配到输出之前存储在哪里,即Flink是否将它们放在某种缓冲区中?如果是,数据是如何传输到网络的?

来自官方

收集记录并转发它。收集器是“推送” {@link java.util.Iterator}的对应项,它“拉入”数据


因此,它接收一个值并将一个或多个值存储到迭代器中。然后推到下一个操作员。但这是网络堆栈/缓冲区的问题。

但是在接收(可存储)和存储部分(收集器)之间是否发生了一些数据序列化/反序列化?给出的例子可能有点误导。想象一下稍微修改过的flatMap函数,它只是通过collector.collect(value)返回修改过的字符串。e、 g:
publicvoidflatmap(字符串值,收集器输出){out.collect(值);}}
实际处理的数据会发生什么情况?收集器是否产生某种流量?这取决于下一个操作员。假设在
flatmap
之后有一个
keyBy
操作符。
keyBy
操作符将数据划分到洗牌阶段。
keyBy
之后的操作员很可能是一个
减速器
,它被放置在另一台机器上。然后将进行反序列化/序列化。现在,如果
flatmap
后面的操作员是另一个
map
,则可能将其放置在同一台机器和TaskManager中。然后Flink在同一个线程中融合两个操作符,并且没有发生反序列化/序列化。这是一个很好的参考:这就是我要找的!谢谢