Apache flink 弗林克:重叠阅读

Apache flink 弗林克:重叠阅读,apache-flink,Apache Flink,我想用以下访问模式实现一个算法(类似于有限差分算法): 在本例中,数据集_1的第一个值用于计算数据集_2的第一个和第二个值。对于这个值,我应该有两个不同的键。 因此,数据集_1的某些值必须读取多次(2或3次) 我想我必须使用groupBy(key).reduce(Algorithm)转换,但我不知道如何定义键。这听起来像是一个滑动窗口计算。您应该使用DataStream而不是DataSet,并应用大小为3、步长为1的窗口 StreamExecutionEnvironment env = Str

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

在本例中,数据集_1的第一个值用于计算数据集_2的第一个和第二个值。对于这个值,我应该有两个不同的键。 因此,数据集_1的某些值必须读取多次(2或3次)


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

这听起来像是一个滑动窗口计算。您应该使用
DataStream
而不是
DataSet
,并应用大小为3、步长为1的窗口

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

DataStream dataset_2 = env.readTextFile(textPathTo-Dataset_1).window(Count.of(3)).every(Count.of(1)).WINDOW_FUNCTION(...).flatten();

有多个
WINDOW\u函数可用(例如,mxn、min、sum或generic mapWindow、foldWindow、reduceWindow)。请查看文档中适合您的用例的函数:

除非您在单个线程中处理它们,否则不会订购Flink数据集,即使用parallelism 1。您可以了解如何向数据中添加顺序索引并将该索引用作键

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

有多种方法可以满足您的需求,其中一些方法易于实现,而另一些方法更高效

一种简单的方法是在dataset_1上应用
FlatMapFunction
,它使用三个键
i-1
i
i+1
三次发出索引
i
的每个值。然后,将结果数据集分组到新键上,并使用GroupReduce函数计算新值。这种方法将dataset_1的数据量增加了三倍,但可以轻松地并行化


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

如果dataset_1元素的顺序很重要,则此解决方案仅适用于单个线程(并行度1),对吗?我不能采用第一种解决方案,因为我无法将数据增加三倍以提高性能。对于第二种解决方案,我不知道如何处理重叠阅读。MapPartition将分区获取为Iterable(一次1个元素),但我需要输入数据集的2或3个元素。请你举一个例子来说明重叠的读数好吗?我扩展了范围分区方法的描述。我现在明白了如何使用分区。谢谢