Flinks Collector.collect如何处理数据?

问题描述

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

示例摘自Flink DataSet 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);
    }
  }
}

因此,文本行被拆分为标记,并且每个标记都被“收集”。尽管听起来很直观,但是我却错过了Collector.collect()背后的实际动态。在将收集到的数据分配给输出之前将其存储在哪里,即Flink是否将它们放在某种缓冲区中?如果是,那么如何将数据传输到网络?

解决方法

来自官方source code documentation

收集记录并转发。收藏家就是“推” {@link java.util.Iterator}的对应版本,该版本将数据“拉入”。

因此,它接收一个值并将一个或多个值存储到Iterator中。然后推送到下一个运算符。但这是网络堆栈/缓冲区的问题。