根据flink流文档:
窗口函数可以是ReduceFunction,FoldFunction或 WindowFunction。前两个可以更有效地执行(请参阅 状态大小部分),因为Flink可以逐步汇总 每个窗口到达时的元素。
在批处理模式下是否同样适用?在下面的示例中,我从cassandra读取了约36go的数据,但是我希望减少后的输出要小得多(约0.5go)。运行此作业需要flink将整个输入存储在内存中,还是足够智能以对其进行迭代
DataSet<MyRecord> input = ...;
DataSet<MyRecord> sampled = input
.groupBy(MyRecord::getSampleKey)
.reduce(MyRecord::keepLast);
答案 0 :(得分:1)
根据Flink中的documentation on the Reduce Operation,我看到以下内容:
应用于分组数据集的Reduce转换可减少 使用用户定义的reduce函数将每个组划分为单个元素。 对于每组输入元素,先后执行reduce函数 将成对的元素组合成一个元素,直到只有一个 每个组的元素仍然存在。
请注意,对于ReduceFunction,返回对象的键控字段 应该与输入值匹配。 这是因为reduce是隐式的 可合并,并且从合并操作符发出的对象再次出现 传递给reduce运算符时,按键分组。
如果我没看错,Flink在 mapper 端执行归约操作,然后再次在 reducer 端执行归约操作,因此实际发出/序列化的数据应该很小。