增强groupReduce转换的并行化程度

时间:2016-01-01 21:14:43

标签: java apache-flink

在我的Flink程序中,我使用flatMap操作转换数据,该操作将多个较小的块中的几个数据块分开。这些街区位于"位置"描述它们在相应原始块中的位置的属性。现在我使用groupReduce,它需要转换所有共享相同"位置"的小块。属性。因此它应该可以在多个节点上轻松分发。但是当我在多个节点上运行我的程序时,groupReduce的执行掺杂为1。

我想这是因为我只有一个DataSet,但似乎Flink Java API中没有GroupedDataSet。还有另一种可能性来增强我groupReduce转换的掺杂吗?

这是我正在使用的代码(虚拟代码忽略"详细信息"):

DataSet<SlicedTile> slicedTiles = tiles.flatMap()
    .groupBy(position)
    .sortGroup(time)
    .getDataSet()
    //Until here the dop is correct

DataSet<SlicedTile> processedSlicedTiles = slicedTiles.reduceGroup;

1 个答案:

答案 0 :(得分:2)

您的代码存在问题getDataSet()。它返回分组操作的输入。因此,由slicedTiles表示的数据集既不会被分组,也不会对其组进行排序,而是flatMap转换的结果,并且不会考虑groupBysortGroup次调用在该计划中。

对未分组的数据集应用groupReduce(或reduce)操作始终是非并行操作,因为输入数据集的所有元素都作为单个组处理。

逻辑上,三个转换groupBy().sortGroup().reduceGroup()属于一起并被转换为单个groupReduce运算符(如果GroupReduceFunction可组合,可能还有一个额外的组合器。)

如果您按如下方式更改实施,它应该按预期工作。

DataSet<SlicedTile> slicedTiles = tiles.flatMap()
    .groupBy(position)
    .sortGroup(time)
    .reduceGroup(yourFunction);

我将打开一个JIRA问题,将JavaDocs添加到Grouping.getDataSet()方法中,以记录此函数的行为。