问题描述
我试图了解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中。然后推送到下一个运算符。但这是网络堆栈/缓冲区的问题。