flink:阅读重叠

时间:2015-09-09 13:07:21

标签: apache-flink

我想用以下访问模式实现一种算法(类似于有限差分算法):

finite difference

在此示例中,dataset_1的第一个值用于计算dataset_2的第一个和第二个值。所以,我应该为这个值设置2个不同的键。 因此,dataset_1 某些值必须多次读取(2或3次)。

我想我必须使用groupBy(key).reduce(Algorithm)转换,但我不知道如何定义键。

1 个答案:

答案 0 :(得分:4)

除非您在单个线程中处理Flink DataSet,否则不会对其进行排序。例如,并行1.您可以如何为数据添加顺序索引并将该索引用作键。

从您的示例中,我假设dataset_2的索引4的值是根据dataset_1的值3,4和5计算的,即dataset_2的每个值都是从dataset_1的三个(或两个)值派生的。

有多种方法可以做你想要的,有些方法易于实施,有些方法更有效。

执行所需操作的简便方法是在dataset_1上应用FlatMapFunction,使用三个键ii-1三次,使用索引i发出每个值,和i+1。之后,将结果数据集分组到新键上,并使用GroupReduce函数计算新值。这种方法使dataset_1的数据量增加了三倍,但可以很容易地并行化。

另一种选择是进行手动范围分区,这与第一种方法类似,但更通用。我再次假设dataset_1的值具有顺序idx属性。使用FlatMapFunction将partitionIds分配给值,即,对于100个元素的分区大小,执行partitionId = idx / 100之类的操作。分区的第一个和最后一个元素需要发出两次。例如,对于partitionId 1(值100到199)具有idx 100和199的元素需要分别通过发送这些值两次来复制到分区0和2。分配partitionIds后,您可以groupBy(partitionId)sortGroup(idx)groupReduce覆盖分区的所有元素。分区的大小是可配置的。