批处理模式下,flink是否会动态减少

时间:2018-09-07 13:10:31

标签: java mapreduce apache-flink

根据flink流文档:

  

窗口函数可以是ReduceFunction,FoldFunction或   WindowFunction。前两个可以更有效地执行(请参阅   状态大小部分),因为Flink可以逐步汇总   每个窗口到达时的元素。

在批处理模式下是否同样适用?在下面的示例中,我从cassandra读取了约36go的数据,但是我希望减少后的输出要小得多(约0.5go)。运行此作业需要flink将整个输入存储在内存中,还是足够智能以对其进行迭代

DataSet<MyRecord> input = ...;
DataSet<MyRecord> sampled = input
        .groupBy(MyRecord::getSampleKey)
        .reduce(MyRecord::keepLast);

1 个答案:

答案 0 :(得分:1)

根据Flink中的documentation on the Reduce Operation,我看到以下内容:

  

应用于分组数据集的Reduce转换可减少   使用用户定义的reduce函数将每个组划分为单个元素。   对于每组输入元素,先后执行reduce函数   将成对的元素组合成一个元素,直到只有一个   每个组的元素仍然存在。

     

请注意,对于ReduceFunction,返回对象的键控字段   应该与输入值匹配。 这是因为reduce是隐式的   可合并,并且从合并操作符发出的对象再次出现   传递给reduce运算符时,按键分组。

如果我没看错,Flink在 mapper 端执行归约操作,然后再次在 reducer 端执行归约操作,因此实际发出/序列化的数据应该很小。