在我的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;
答案 0 :(得分:2)
您的代码存在问题getDataSet()
。它返回分组操作的输入。因此,由slicedTiles
表示的数据集既不会被分组,也不会对其组进行排序,而是flatMap
转换的结果,并且不会考虑groupBy
和sortGroup
次调用在该计划中。
对未分组的数据集应用groupReduce
(或reduce
)操作始终是非并行操作,因为输入数据集的所有元素都作为单个组处理。
逻辑上,三个转换groupBy().sortGroup().reduceGroup()
属于一起并被转换为单个groupReduce
运算符(如果GroupReduceFunction
可组合,可能还有一个额外的组合器。)
如果您按如下方式更改实施,它应该按预期工作。
DataSet<SlicedTile> slicedTiles = tiles.flatMap()
.groupBy(position)
.sortGroup(time)
.reduceGroup(yourFunction);
我将打开一个JIRA问题,将JavaDocs添加到Grouping.getDataSet()
方法中,以记录此函数的行为。